Dockerfile 指令 | 指令簡介 |
---|---|
FROM | Dockerfile 除了注釋第一行必須是 FROM ,F(xiàn)ROM 后面跟鏡像名稱,代表我們要基于哪個(gè)基礎(chǔ)鏡像構(gòu)建我們的容器。 |
RUN | RUN 后面跟一個(gè)具體的命令,類似于 Linux 命令行執(zhí)行命令。 |
ADD | 拷貝本機(jī)文件或者遠(yuǎn)程文件到鏡像內(nèi) |
COPY | 拷貝本機(jī)文件到鏡像內(nèi) |
USER | 指定容器啟動(dòng)的用戶 |
ENTRYPOINT | 容器的啟動(dòng)命令 |
CMD | CMD 為 ENTRYPOINT 指令提供默認(rèn)參數(shù),也可以單獨(dú)使用 CMD 指定容器啟動(dòng)參數(shù) |
ENV | 指定容器運(yùn)行時(shí)的環(huán)境變量,格式為 key=value |
ARG | 定義外部變量,構(gòu)建鏡像時(shí)可以使用 build-arg = 的格式傳遞參數(shù)用于構(gòu)建 |
EXPOSE | 指定容器監(jiān)聽的端口,格式為 [port]/tcp 或者 [port]/udp |
WORKDIR | 為 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令設(shè)置工作目錄。 |
看了這么多指令,感覺有點(diǎn)懵?別擔(dān)心,我通過一個(gè)實(shí)例讓你來熟悉它們。這是一個(gè) Dockerfile:
FROM centos:7 COPY nginx.repo /etc/yum.repos.d/nginx.repo RUN yum install -y nginx EXPOSE 80 ENV HOST=mynginx CMD ["nginx","-g","daemon off;"]
第一行表示我要基于 centos:7 這個(gè)鏡像來構(gòu)建自定義鏡像。這里需要注意,每個(gè) Dockerfile 的第一行除了注釋都必須以 FROM 開頭。
第二行表示拷貝本地文件 nginx.repo 文件到容器內(nèi)的 /etc/yum.repos.d 目錄下。這里拷貝 nginx.repo 文件是為了添加 nginx 的安裝源。
第三行表示在容器內(nèi)運(yùn)行yum install -y nginx命令,安裝 nginx 服務(wù)到容器內(nèi),執(zhí)行完第三行命令,容器內(nèi)的 nginx 已經(jīng)安裝完成。
第四行聲明容器內(nèi)業(yè)務(wù)(nginx)使用 80 端口對(duì)外提供服務(wù)。
第五行定義容器啟動(dòng)時(shí)的環(huán)境變量 HOST=mynginx,容器啟動(dòng)后可以獲取到環(huán)境變量 HOST 的值為 mynginx。
第六行定義容器的啟動(dòng)命令,命令格式為 json 數(shù)組。這里設(shè)置了容器的啟動(dòng)命令為 nginx ,并且添加了 nginx 的啟動(dòng)參數(shù) -g 'daemon off;' ,使得 nginx 以前臺(tái)的方式啟動(dòng)。
鏡像的實(shí)現(xiàn)原理
其實(shí) Docker 鏡像是由一系列鏡像層(layer)組成的,每一層代表了鏡像構(gòu)建過程中的一次提交。下面以一個(gè)鏡像構(gòu)建的 Dockerfile 來說明鏡像是如何分層的。
FROM busybox
COPY test /tmp/test
RUN mkdir /tmp/testdir
上面的 Dockerfile 由三步組成:
第一行基于 busybox 創(chuàng)建一個(gè)鏡像層;
第二行拷貝本機(jī) test 文件到鏡像內(nèi);
第三行在 /tmp 文件夾下創(chuàng)建一個(gè)目錄 testdir。
這里我的 Docker 使用的是 overlay2 文件驅(qū)動(dòng),進(jìn)入到/var/lib/docker/overlay2目錄下使用tree .命令查看產(chǎn)生的鏡像文件:
$ tree . # 以下為 tree . 命令輸出內(nèi)容 |-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679 | |-- diff # 這一層為基礎(chǔ)層,對(duì)應(yīng)上述 Dockerfile 第一行,包含 busybox 鏡像所有文件內(nèi)容,例如 /etc,/bin,/var 等目錄 ... 此次省略部分原始鏡像文件內(nèi)容 | `-- link |-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391 | |-- diff # 這一層對(duì)應(yīng)上述 Dockerfile 第二行,拷貝 test 文件到 /tmp 文件夾下,因此 diff 文件夾下有了 /tmp/test 文件 | | `-- tmp | | `-- test | |-- link | |-- lower | `-- work |-- backingFsBlockDev |-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1 | |-- diff # 這一層對(duì)應(yīng)上述 Dockerfile 第三行,在 /tmp 文件夾下創(chuàng)建 testdir 文件夾,因此 diff 文件夾下有了 /tmp/testdir 文件夾 | | `-- tmp | | `-- testdir | |-- link | |-- lower | `-- work ...
通過上面的目錄結(jié)構(gòu)可以看到,Dockerfile 的每一行命令,都生成了一個(gè)鏡像層,每一層的 diff 夾下只存放了增量數(shù)據(jù),如圖 2 所示。
分層的結(jié)構(gòu)使得 Docker 鏡像非常輕量,每一層根據(jù)鏡像的內(nèi)容都有一個(gè)唯一的 ID 值,當(dāng)不同的鏡像之間有相同的鏡像層時(shí),便可以實(shí)現(xiàn)不同的鏡像之間共享鏡像層的效果。
總結(jié)一下, Docker 鏡像是靜態(tài)的分層管理的文件組合,鏡像底層的實(shí)現(xiàn)依賴于聯(lián)合文件系統(tǒng)(UnionFS)。充分掌握鏡像的原理,可以幫助我們?cè)谏a(chǎn)實(shí)踐中構(gòu)建出最優(yōu)的鏡像,同時(shí)也可以幫助我們更好地理解容器和鏡像的關(guān)系。
總結(jié)
到此,相信你已經(jīng)對(duì) Docker 鏡像這一核心概念有了較深的了解,并熟悉了 Docker 鏡像的常用操作(拉取、查看、“重命名”、刪除和構(gòu)建自定義鏡像)及底層實(shí)現(xiàn)原理。
鏡像操作命令:
拉取鏡像,使用 docker pull 命令拉取遠(yuǎn)程倉庫的鏡像到本地 ;
重命名鏡像,使用 docker tag 命令“重命名”鏡像 ;
查看鏡像,使用 docker image ls 或 docker images 命令查看本地已經(jīng)存在的鏡像;
刪除鏡像,使用 docker rmi 命令刪除無用鏡像 ;
構(gòu)建鏡像,構(gòu)建鏡像有兩種方式。第一種方式是使用 docker build 命令基于 Dockerfile 構(gòu)建鏡像,也是我比較推薦的鏡像構(gòu)建方式;第二種方式是使用 docker commit 命令基于已經(jīng)運(yùn)行的容器提交為鏡像。
鏡像的實(shí)現(xiàn)原理:
鏡像是由一系列的鏡像層(layer )組成,每一層代表了鏡像構(gòu)建過程中的一次提交,當(dāng)我們需要修改鏡像內(nèi)的某個(gè)文件時(shí),只需要在當(dāng)前鏡像層的基礎(chǔ)上新建一個(gè)鏡像層,并且只存放修改過的文件內(nèi)容。分層結(jié)構(gòu)使得鏡像間共享鏡像層變得非常簡單和方便。
以上這篇Docker 制作鏡像Dockerfile和commit操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
標(biāo)簽:南通 邯鄲 臨汾 忻州 延安 辛集 海西 西安
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Docker 制作鏡像Dockerfile和commit操作》,本文關(guān)鍵詞 Docker,制作,鏡像,Dockerfile,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。