一、鳥瞰容器生態(tài)系統(tǒng)
Docker 現(xiàn)在幾乎是容器的代名詞。確實,是 Docker 將容器技術(shù)發(fā)揚光大。同時,大家也需要知道圍繞 Docker 還有一個生態(tài)系統(tǒng)。Docker 是這個生態(tài)系統(tǒng)的基石,但完善的生態(tài)系統(tǒng)才是保障 Docker 以及容器技術(shù)能夠真正健康發(fā)展的決定因素。下面一圖大致列出了整個容器生態(tài)圈及其簡單介紹:

二、Docker核心組件
- Docker 客戶端 - Client
- Docker 服務(wù)器 - Docker daemon
- Docker 鏡像 - Image
- Registry
- Docker 容器 - Container
Docker 架構(gòu)如下圖所示:

Docker 采用的是 Client/Server 架構(gòu)??蛻舳讼蚍?wù)器發(fā)送請求,服務(wù)器負(fù)責(zé)構(gòu)建、運行和分發(fā)容器??蛻舳撕头?wù)器可以運行在同一個 Host 上,客戶端也可以通過 socket 或 REST API 與遠(yuǎn)程的服務(wù)器通信。
2.1 DockerFile最常用的指令
FROM
指定 base 鏡像。MAINTAINER
設(shè)置鏡像的作者,可以是任意字符串。COPY
將文件從 build context 復(fù)制到鏡像。
COPY 支持兩種形式:
1、COPY src dest
2、COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目錄。ADD
與 COPY 類似,從 build context 復(fù)制文件到鏡像。不同的是,如果 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。ENV
設(shè)置環(huán)境變量,環(huán)境變量可被后面的指令使用。例如:
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
EXPOSE
指定容器中的進程會監(jiān)聽某個端口,Docker 可以將該端口暴露出來。VOLUME
將文件或目錄聲明為 volume。WORKDIR
為后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設(shè)置鏡像中的當(dāng)前工作目錄。RUN
在容器中運行指定的命令。CMD
容器啟動時運行指定的命令。
Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效。CMD 可以被 docker run 之后的參數(shù)替換。ENTRYPOINT
設(shè)置容器啟動時運行的命令。
Dockerfile 中可以有多個 ENTRYPOINT 指令,但只有最后一個生效。CMD 或 docker run 之后的參數(shù)會被當(dāng)做參數(shù)傳遞給 ENTRYPOINT。RUN vs CMD vs ENTRYPOINT
1、RUN 執(zhí)行命令并創(chuàng)建新的鏡像層,RUN 經(jīng)常用于安裝軟件包。
2、CMD 設(shè)置容器啟動后默認(rèn)執(zhí)行的命令及其參數(shù),但 CMD 能夠被 docker run 后面跟的命令行參數(shù)替換。
3、ENTRYPOINT 配置容器啟動時運行的命令。
我們可用兩種方式指定 RUN、CMD 和 ENTRYPOINT 要運行的命令:Shell 格式和 Exec 格式,二者在使用上有細(xì)微的區(qū)別。
Shell 格式
<instruction> <command>
Exec 格式
<instruction> ["executable", "param1", "param2", ...]
CMD 和 ENTRYPOINT 推薦使用 Exec 格式,因為指令可讀性更強,更容易理解。RUN 則兩種格式都可以。
最佳實踐
1、使用 RUN 指令安裝應(yīng)用和軟件包,構(gòu)建鏡像。
2、如果 Docker 鏡像的用途是運行應(yīng)用程序或服務(wù),比如運行一個 MySQL,應(yīng)該優(yōu)先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可為 ENTRYPOINT 提供額外的默認(rèn)參數(shù),同時可利用 docker run 命令行替換默認(rèn)參數(shù)。
3、如果想為容器設(shè)置默認(rèn)的啟動命令,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認(rèn)命令。
2.2 Docker 鏡像 - Image
base 鏡像提供的是最小安裝的 Linux 發(fā)行版。base 鏡像只是在用戶空間與發(fā)行版一致,kernel 版本與發(fā)行版是不同的;容器只能使用 Host 的 kernel,并且不能修改。
使用tag給鏡像命名:假設(shè)我們現(xiàn)在發(fā)布了一個鏡像 myimage,版本為 v1.9.1。那么我們可以給鏡像打上四個 tag:1.9.1、1.9、1 和 latest。
docker tag myimage-v1.9.1 myimage:1
docker tag myimage-v1.9.1 myimage:1.9
docker tag myimage-v1.9.1 myimage:1.9.1
docker tag myimage-v1.9.1 myimage:latest
效果:
myimage:1 始終指向 1 這個分支中最新的鏡像。
myimage:1.9 始終指向 1.9.x 中最新的鏡像。
myimage:latest 始終指向所有版本中最新的鏡像。
如果想使用特定版本,可以選擇 myimage:1.9.1、myimage:1.9.2 或 myimage:2.0.0。
-
當(dāng)容器啟動時,一個新的可寫層被加載到鏡像的頂部。這一層通常被稱作“容器層”,“容器層”之下的都叫“鏡像層”。只有容器層是可寫的,容器層下面的所有鏡像層都是只讀的。
鏡像的常用操作:
images 顯示鏡像列表
history 顯示鏡像構(gòu)建歷史
commit 從容器創(chuàng)建新鏡像
build 從 Dockerfile 構(gòu)建鏡像
tag 給鏡像打 tag
pull 從 registry 下載鏡像
push 將 鏡像 上傳到 registry
rmi 刪除 Docker host 中的鏡像
search 搜索 Docker Hub 中的鏡像
