
其實(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)下載安裝
首先在 Docker 官網(wǎng) https://www.docker.com 注冊(cè)一個(gè)賬號(hào),登錄賬號(hào)
進(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 的一些概念
鏡像存放在鏡像倉(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
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】