一、鳥瞰容器生態(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ù)器負責構(gòu)建、運行和分發(fā)容器呛牲」蚊龋客戶端和服務(wù)器可以運行在同一個 Host 上,客戶端也可以通過 socket 或 REST API 與遠程的服務(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è)置鏡像中的當前工作目錄。RUN
在容器中運行指定的命令灾部。CMD
容器啟動時運行指定的命令康铭。
Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效赌髓。CMD 可以被 docker run 之后的參數(shù)替換从藤。ENTRYPOINT
設(shè)置容器啟動時運行的命令。
Dockerfile 中可以有多個 ENTRYPOINT 指令锁蠕,但只有最后一個生效呛哟。CMD 或 docker run 之后的參數(shù)會被當做參數(shù)傳遞給 ENTRYPOINT。RUN vs CMD vs ENTRYPOINT
1匿沛、RUN 執(zhí)行命令并創(chuàng)建新的鏡像層,RUN 經(jīng)常用于安裝軟件包榛鼎。
2逃呼、CMD 設(shè)置容器啟動后默認執(zhí)行的命令及其參數(shù),但 CMD 能夠被 docker run 后面跟的命令行參數(shù)替換者娱。
3抡笼、ENTRYPOINT 配置容器啟動時運行的命令。
我們可用兩種方式指定 RUN黄鳍、CMD 和 ENTRYPOINT 要運行的命令:Shell 格式和 Exec 格式推姻,二者在使用上有細微的區(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 提供額外的默認參數(shù)欲鹏,同時可利用 docker run 命令行替換默認參數(shù)。
3臭墨、如果想為容器設(shè)置默認的啟動命令赔嚎,可使用 CMD 指令。用戶可在 docker run 命令行中替換此默認命令裙犹。
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鹿蜀。
-
當容器啟動時,一個新的可寫層被加載到鏡像的頂部服球。這一層通常被稱作“容器層”茴恰,“容器層”之下的都叫“鏡像層”。只有容器層是可寫的斩熊,容器層下面的所有鏡像層都是只讀的往枣。
鏡像的常用操作:
images 顯示鏡像列表
history 顯示鏡像構(gòu)建歷史
commit 從容器創(chuàng)建新鏡像
build 從 Dockerfile 構(gòu)建鏡像
tag 給鏡像打 tag
pull 從 registry 下載鏡像
push 將 鏡像 上傳到 registry
rmi 刪除 Docker host 中的鏡像
search 搜索 Docker Hub 中的鏡像