初識(shí) Docker

Docker

其實(shí)這篇文章在一年多前就起好名字了,因?yàn)橹白约簩?duì) Docker 的鏡像,容器等概念比較混淆,所以一直都沒(méi)有寫。由于最近重新看了 Docker 的內(nèi)容,也將 Docker 應(yīng)用到自己寫的 Python 項(xiàng)目 https://github.com/AD-feiben/qc-remind 中,將該 Python 項(xiàng)目制作成一個(gè) Docker 鏡像,在使用起來(lái)非常方便,所以用這篇文章記錄一下 Docker 的一些知識(shí)點(diǎn),同時(shí)分享給大家。關(guān)于如何制作鏡像也會(huì)在以后的文章中講到。

對(duì)于什么是 Docker、Docker 的歷史、Docker 通過(guò)什么技術(shù)實(shí)現(xiàn)、以及為什么要使用 Docker。這里就不在搬運(yùn)了網(wǎng)上的文章了,直接上手學(xué)習(xí) Docker。

如果對(duì)上面的內(nèi)容有興趣,可以訪問(wèn) https://yeasy.gitbooks.io/docker_practice/ 進(jìn)行學(xué)習(xí)

一、安裝

因?yàn)槲业氖?Mac,這里只講 Mac 的安裝,其他系統(tǒng)的安裝可以參考 https://yeasy.gitbooks.io/docker_practice/install/

1.1 使用 Homebrew 安裝


$ brew cask install docker

使用 brew cask 安裝即可

1.2 手動(dòng)下載安裝

  1. 首先在 Docker 官網(wǎng) https://www.docker.com 注冊(cè)一個(gè)賬號(hào),登錄賬號(hào)

  2. 進(jìn)入 https://hub.docker.com/?overlay=onboarding 下載安裝即可

下載

下載完成之后雙加 .dmg 文件,將應(yīng)用拖到 Application 文件夾中即可。安裝完成后,在狀態(tài)欄就可以看到 Docker 的 logo,說(shuō)明安裝成功。可以通過(guò) docker --version 命令查看 Docker 的版本。


$ docker --version

Docker version 19.03.2, build 6a30dfc

二、Docker 的一些概念

https://user-gold-cdn.xitu.io/2019/10/7/16da661eef3572d0?w=1067&h=811&f=png&s=90020

鏡像存放在鏡像倉(cāng)庫(kù)中,Docker 官方也提供了鏡像倉(cāng)庫(kù) https://hub.docker.com/ ,我們可以從這里下載我們所需要的鏡像,當(dāng)然也可以將我們制作好的鏡像存放到倉(cāng)庫(kù)中。當(dāng)我們下載好鏡像之后,我們可以通過(guò) run 命令來(lái)創(chuàng)建對(duì)應(yīng)的容器,一個(gè)鏡像可以創(chuàng)建多個(gè)容器,每個(gè)容器,相互之間不會(huì)產(chǎn)生影響。

2.1 image 鏡像

以下鏡像的操作均以 Nginx 鏡像為例

2.1.1 搜索鏡像


$ docker search nginx

NAME                              DESCRIPTION                                    STARS              OFFICIAL            AUTOMATED

nginx                            Official build of Nginx.                        12022              [OK]

jwilder/nginx-proxy              Automated Nginx reverse proxy for docker con…  1669                                    [OK]

richarvey/nginx-php-fpm          Container running Nginx + PHP-FPM capable of…  742                                    [OK]

linuxserver/nginx                An Nginx container, brought to you by LinuxS…  77

bitnami/nginx                    Bitnami nginx Docker Image                      71                                      [OK]

tiangolo/nginx-rtmp              Docker image with Nginx using the nginx-rtmp…  55                                      [OK]

nginxdemos/hello                  NGINX webserver that serves a simple page co…  28                                      [OK]

jlesage/nginx-proxy-manager      Docker container for Nginx Proxy Manager        24                                      [OK]

jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…  23

nginx/nginx-ingress              NGINX Ingress Controller for Kubernetes        22

可以看到 鏡像名 鏡像描述 點(diǎn)贊數(shù) 是否為官方鏡像 是否為自動(dòng)生成

2.1.2 下載鏡像

利用 docker pull 鏡像名[:版本] 下載我們需要的鏡像,不輸入版本號(hào)默認(rèn)為 latest


$ docker pull nginx

Using default tag: latest

latest: Pulling from library/nginx

b8f262c62ec6: Pull complete

e9218e8f93b1: Pull complete

7acba7289aa3: Pull complete

Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1

Status: Downloaded newer image for nginx:latest

docker.io/library/nginx:latest

2.1.3 列出本地鏡像

可以使用 docker image ls 或者 docker images 來(lái)列出本地存在的鏡像


$ docker images

REPOSITORY          TAG                IMAGE ID            CREATED            SIZE

nginx              latest              f949e7d76d63        8 days ago          126MB

centos              latest              67fa590cfc1c        6 weeks ago        202MB

其中 REPOSITORY 為鏡像名;TAG 為鏡像標(biāo)簽;IMAGE ID 為鏡像id;CREATED 為鏡像創(chuàng)建時(shí)間;SIZE 為鏡像大小,該大小為解壓縮后的大小,一般比倉(cāng)庫(kù)中的現(xiàn)實(shí)的鏡像大?。▔嚎s后的大小,便于傳輸)要大一些。

2.1.4 刪除鏡像

通過(guò) docker image rm 鏡像名/鏡像id 或者 docker rmi 鏡像名/鏡像id 來(lái)刪除指定的鏡像

  • 刪除鏡像時(shí),需要該鏡像沒(méi)有被使用,否則將會(huì)看到類似下面的錯(cuò)誤提示

$ docker rmi nginx

Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container b36481b353d3 is using its referenced image f949e7d76d63

在 Docker 倉(cāng)庫(kù)中還有很多優(yōu)秀的鏡像,例如 Ubuntu、CentOS、MySQL 等,大家可以自行查找。

2.2 container 容器

2.2.1創(chuàng)建容器

我們可以使用 docker run [選項(xiàng)] 鏡像 來(lái)創(chuàng)建一個(gè)容器,如果鏡像在本地不存在,則會(huì)先到鏡像倉(cāng)庫(kù)下載該鏡像。下面的例子是 nginx 鏡像不存在的情況。


$ docker run -p 8080:80 nginx

Unable to find image 'nginx:latest' locally

latest: Pulling from library/nginx

b8f262c62ec6: Pull complete

e9218e8f93b1: Pull complete

7acba7289aa3: Pull complete

Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1

Status: Downloaded newer image for nginx:latest

# 終端處于監(jiān)聽容器日志的狀態(tài)

  • -p 參數(shù)將容器中的 80 端口映射到宿主機(jī)中的 8080 端口

在瀏覽器打開 localhost:8080 就可以看到熟悉的 nginx 歡迎頁(yè)面了。退出容器可以使用 Ctrl + C

https://user-gold-cdn.xitu.io/2019/10/7/16da661f11ea5720?w=1200&h=520&f=jpeg&s=83078

2.2.2 查看運(yùn)行中的容器

我們可以使用 docker ps 或者 docker container ls 查看運(yùn)行中的容器。

上一步驟通過(guò) Ctrl + C 停止了容器


$ docker ps

CONTAINER ID        IMAGE              COMMAND            CREATED            STATUS              PORTS              NAMES

可以看到并沒(méi)有運(yùn)行中的容器,我們可以加上 -a 顯示所有容器,包括停止?fàn)顟B(tài)的容器


docker ps -a

CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS                    PORTS              NAMES

a2d6842faeb5        nginx              "nginx -g 'daemon of…"  2 hours ago        Exited (0) 2 minutes ago                      crazy_northcutt

加上 -a 后我們就可以看到已經(jīng)處于停止?fàn)顟B(tài)的容器。

下一步通過(guò)下面命令啟動(dòng)一個(gè)新的容器


$ docker run -dit -p 8080:80 nginx

b36481b353d30976171cf7c706f4ce4890f81ee1a81c7e526799fb12198e7f23

  • -dit 參數(shù)也可以分開寫為 -d -i -t

  • -d 參數(shù)表示容器在后臺(tái)運(yùn)行,并不會(huì)像上個(gè)例子處于監(jiān)聽容器日志的狀態(tài)

  • -i 參數(shù)表示讓容器的標(biāo)準(zhǔn)輸入保持打開

  • -t 參數(shù)表示讓 Docker 分配一個(gè)偽終端

可以看到這次的結(jié)果并不像 docker run -p 8080:80 nginx 那樣,處于監(jiān)聽日志的狀態(tài)。而是返回一個(gè)容器id后,終端又恢復(fù)到正常狀態(tài)。


$ docker ps -a

CONTAINER ID        IMAGE              COMMAND                  CREATED            STATUS                      PORTS                  NAMES

b36481b353d3        nginx              "nginx -g 'daemon of…"  10 minutes ago      Up 10 minutes              0.0.0.0:8080->80/tcp  recursing_khayyam

a2d6842faeb5        nginx              "nginx -g 'daemon of…"  2 hours ago        Exited (0) 15 minutes ago                          crazy_northcutt

通過(guò) docker ps -a 命令可以看到,docker 存在兩個(gè)容器。從這個(gè)例子我們可以知道,同一個(gè)鏡像,如果使用 run 命令創(chuàng)建容器,那么每個(gè)容器都是不同的實(shí)例。

2.2.3 停止容器

如果容器處在后臺(tái)運(yùn)行,我們可以通過(guò) docker ps 或者 docker container ls 將運(yùn)行中的容器實(shí)例獲取到,然后通過(guò) docker container stop 容器id/容器名 停止指定容器。


$ docker container stop b36481b353d3

# b36481b353d3 為第二個(gè)容器例子,后臺(tái)運(yùn)行的容器

2.2.4 啟動(dòng)容器

當(dāng)然容器也是可以重新啟動(dòng)的,不需要每次創(chuàng)建。通過(guò) docker container start 容器id 即可重新啟動(dòng)


$ docker container start b36481b353d3

  • 通過(guò) start 命令啟動(dòng)的容器都會(huì)在后臺(tái)運(yùn)行。

2.2.5 進(jìn)入容器內(nèi)

通過(guò) docker exec -it 容器id /bin/bash 命令進(jìn)入容器內(nèi),通過(guò) -it 參數(shù)打開容器的交互式終端


docker exec -it b36481b353d3 /bin/bash

root@b36481b353d3:/#

我們可以在此修改容器內(nèi)的東西,修改完后通過(guò) exit 退出容器,通過(guò) exec 命令進(jìn)入容器,退出后容器仍處于運(yùn)行的狀態(tài)。

2.2.6 刪除容器

通過(guò) docker container rm 容器id 刪除指定容器。用該方法只能刪除一個(gè)容器,如果我們想要?jiǎng)h除多個(gè)容器,可以用空格隔開容器id。如果想刪除的容器非常多,可以使用 docker container prune 刪除所有處于停止?fàn)顟B(tài)的容器。


$ docker container prune

WARNING! This will remove all stopped containers.

Are you sure you want to continue? [y/N] y

Deleted Containers:

a2d6842faeb5cf039420edd684714134c52ca683aefc53a3934792251310ed1d

Total reclaimed space: 0B

  • 刪除容器時(shí),容器需要處于停止?fàn)顟B(tài)。我們可以通過(guò) docker ps -a 查看停止?fàn)顟B(tài)的容器

2.3 repository 倉(cāng)庫(kù)

由于篇幅問(wèn)題,有關(guān)倉(cāng)庫(kù)的內(nèi)容將會(huì)放到下一篇文章中。


如果你喜歡我的文章,希望可以關(guān)注一下我的公眾號(hào)【前端develop】

前端develop
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容