Dockerfile文件編寫實戰(zhàn)練習(xí)及注意事項
1.什么是Dockerfile
Dockerfile 是一個文本文件,其內(nèi)包含了一條條的指令(Instruction),用于構(gòu)建鏡像。每一條指令構(gòu)建一層鏡像,因此每一條指令的內(nèi)容,就是描述該層鏡像應(yīng)當(dāng)如何構(gòu)建。dockerfile的原理就是鏡像分層。
Dockerfile 用于指示 docker image build 命令自動構(gòu)建Image的源代碼是純文本文件。
2. Dockerfile作用
- 標(biāo)準(zhǔn)化構(gòu)建流程:它確保每次構(gòu)建鏡像的過程都是相同的,這有助于復(fù)現(xiàn)性和可維護(hù)性。
- 自動化構(gòu)建:自動化處理從基礎(chǔ)鏡像到最終鏡像的整個構(gòu)建過程。
- 可重復(fù)性:可以多次使用同一個 Dockerfile 構(gòu)建鏡像,每次都得到相同的結(jié)果。
- 環(huán)境配置:可以在 Dockerfile 中配置運行應(yīng)用所需的所有依賴項和環(huán)境變量。
3.dockerfile 的基本結(jié)構(gòu):
- 基礎(chǔ)映像(Base Image):使用 FROM 指令指定基礎(chǔ)映像,作為構(gòu)建鏡像的起點?;A(chǔ)映像通常包含了操作系統(tǒng)和一些預(yù)裝的軟件和工具。
- 構(gòu)建過程指令:使用一系列指令來描述構(gòu)建過程,例如 RUN 用于執(zhí)行命令和安裝軟件包,COPY 用于拷貝文件和目錄,ADD 用于拷貝和提取文件,WORKDIR 用于設(shè)置工作目錄,等等。
- 容器啟動指令:使用 CMD 或 ENTRYPOINT 指令來定義容器啟動時要執(zhí)行的命令,也就是默認(rèn)的容器執(zhí)行命令。
4.dockerfile指令:
FROM 指定基礎(chǔ)鏡像,dockerfile構(gòu)建鏡像的第一個指令
Eg:FROM centos:centos7.9.2009
LABEL 指定鏡像維護(hù)人信息
Eg:LABEL ZhangSan zs@163.com
ADD/COPY 復(fù)制本地文件/目錄到鏡像中
COPY 指令用于將本地文件復(fù)制到容器中??梢詮?fù)制單個文件,也可以復(fù)制整個目錄。
語法格式:
COPY src dest
COPY ["src", "dest"]
解析:
- <src源路徑>:源文件或者源目錄
- <dest目標(biāo)路徑>:容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創(chuàng)建。
Eg:COPY test.txt /absoluteDir/
ADD 將宿主機(jī)目錄下(或遠(yuǎn)程文件)的文件拷貝進(jìn)鏡像,且會自動處理URL和解壓tar壓縮包。
語法格式:
- ADD URL /dest #將文件下載到容器內(nèi)部并以dest命名
- ADD URL /dest/ #將文件下載到容器內(nèi)的/dest目錄
- ADD src /dest/ #將本地文件傳到容器/dest目錄下,壓縮文件會自動解壓
解析:
- src 路徑必須在構(gòu)建的上下文中; 不能使用 ../something /something 這種方式,因為docker 構(gòu)建的第一步是將上下文目錄(和子目錄)發(fā)送到docker守護(hù)程序。
- 如果 src 是URL,并且 dest 不以斜杠結(jié)尾,則從URL下載文件并將其復(fù)制到 dest 。
- 如果 dest 以斜杠結(jié)尾,將自動推斷出url的名字(保留最后一部分),保存到 dest
- 如果 src 是目錄,則將復(fù)制目錄的整個內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)。
Eg:ADD alertmanager-0.19.0.linux-amd64.tar.gz /usr/local/bin
RUN 指定Linux命令,建議多個命令用 && 或 ; 串起來使用
語法格式:
RUN <命令行命令> ( shell 形式, /bin/sh -c 的方式運行,避免破壞shell字符串)
Eg: RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'
ENV 設(shè)置鏡像環(huán)境變量
這個環(huán)境變量可以在后續(xù)的任何RUN指令中使用,這就如同在命令前面指定了環(huán)境變量前綴一樣;也可以在其它指令中直接使用這些環(huán)境變量;相當(dāng)于定義(賦值)。
Eg:ENV CATALINA_HOME /usr/local/tomcat
WORKDIR $CATALINA_HOME
EXPOSE 暴露容器端口
EXPOSE指令實際上不會發(fā)布端口。 它充當(dāng)構(gòu)建映像的人員和運行容器的人員之間的一種文檔,即有關(guān)打算發(fā)布哪些端口的信息。
Eg:EXPOSE 80/tcp
VOLUME 指定容器的匿名數(shù)據(jù)卷
Eg: VOLUME /var/log
作用:把容器的某些文件夾映射到主機(jī)外部
解析:
- VOLUME 掛載點
- 無法指定宿主機(jī)的目錄,會掛載到宿主機(jī)/var/lib/docker/volumes下隨機(jī)生成的目錄下
- 掛載點可以是一個路徑,也可以是數(shù)組(數(shù)組中的每一項必須用雙引號)
USER 指定容器運行用戶
指定該鏡像以及構(gòu)建鏡像時的命令以什么樣的用戶去執(zhí)行,如果不指定,默認(rèn)是root。(一般不修改該配置),可搭配COPY使用。
語法格式:
USER <user>[:<group>]
Eg:USER patrick
USER 1000:1000
WORKDIR 指定鏡像的工作目錄
WORKDIR指令為Dockerfile中跟隨它的所有 RUN,CMD,ENTRYPOINT,COPY,ADD 指令設(shè)置工作目 錄。 如果WORKDIR不存在,即使以后的Dockerfile指令中未使用它也將被創(chuàng)建。
WORKDIR指令可在Dockerfile中多次使用。如果提供了相對路徑,則它將相對于上一個WORKDIR指令的路徑。
Eg:WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#結(jié)果 /a/b/c
ARG 指定構(gòu)建鏡像時傳入的參數(shù)
構(gòu)建時--build-arg 指定參數(shù)會覆蓋Dockerfile 中指定的同名參數(shù) docker build --build-arg 變量=值
ARG只在構(gòu)建期有效,運行期無效,且一次只能指定一個參數(shù)
Eg:ARG version=3.13.4
FROM alpine:$version
CMD/ENTRYPOINT 指定容器啟動時執(zhí)行的命令
語法格式:
CMD command param1 param2
CMD ["param1","param2"]
ENTRYPOINT ["executable", "param1", "param2"]
Eg:CMD ["1111"]
CMD ["2222"]
ENTRYPOINT ["echo"]
#構(gòu)建出如上鏡像后測試
docker run xxxx:效果 echo 2222
指令之間的區(qū)別:
- ADD 和 COPY 的區(qū)別
COPY只能復(fù)制本地文件/目錄到鏡像中
ADD不光可以復(fù)制本地文件/目錄到鏡像中,還可以通過URL下載文件復(fù)制到鏡像中,還能將本地tar壓縮包解壓后復(fù)制到鏡像中。(URL下載和tar包解壓特性不能一起使用)
- ENTRYPOINT 和 CMD 的區(qū)別
CMD 提供容器默認(rèn)的執(zhí)行命令,可以被運行容器時傳入的命令覆蓋。
ENTRYPOINT 配置容器啟動時執(zhí)行的默認(rèn)可執(zhí)行文件,可以被運行容器時傳入的命令追加到其參數(shù)之后。
ENTRYPOINT 指定的容器啟動時運行命令優(yōu)先級更高,如果 ENTRYPOINT 和 CMD 同時存在,CMD 指定內(nèi)容將作為 ENTRYPOINT 指定的命令的選項或參數(shù)去使用
5.Dockerfile構(gòu)建過程:
基礎(chǔ)知識:
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數(shù)
- 指令按照從上到下,順序執(zhí)行
- # 表示注釋
- 每條指令都會創(chuàng)建一個新的鏡像層,并對鏡像進(jìn)行提交
構(gòu)建鏡像和運行容器:
保存好 Dockerfile 后,可以使用以下命令構(gòu)建鏡像。在Docker中,docker build -t my-node-app . 中的小數(shù)點代表當(dāng)前上下文的路徑。這個路徑是構(gòu)建過程中 Docker 引擎查找 Dockerfile 和其他構(gòu)建上下文的文件的位置。
docker build 命令會將指定的路徑(這里是小數(shù)點 .)作為構(gòu)建上下文。構(gòu)建上下文是構(gòu)建過程中用來查找 Dockerfile 和其他構(gòu)建文件的目錄。在這個例子中,. 表示當(dāng)前目錄,即你運行 docker build 命令的目錄。
Eg:docker build -f Dockerfile -t entrytest .
思路:
- 基于一個空的鏡像
- 下載需要的環(huán)境 ADD
- 執(zhí)行環(huán)境變量的配置 ENV
- 執(zhí)行一些Linux命令 RUN
- 日志 CMD
- 端口暴露 EXPOSE
- 掛載數(shù)據(jù)卷 VOLUMES
6.實戰(zhàn)練習(xí)
編寫Dockerfile文件,構(gòu)建entrytest鏡像,
要求:
基于centos鏡像,輸出hello world
#編寫Dockerfile文件 [root@master Monitor]# vi Dockerfile FROM centos:centos7.9.2009 ENTRYPOINT ["echo","hello"] CMD ["world"] #運行容器,傳遞參數(shù) [root@master Monitor]# docker build -f Dockerfile -t entrytest . Sending build context to Docker daemon 360.5MB Step 1/3 : FROM centos:centos7.9.2009 ---> eeb6ee3f44bd Step 2/3 : ENTRYPOINT ["echo","hello"] ---> Running in 92f02cf3ef33 Removing intermediate container 92f02cf3ef33 ---> dd20bc124389 Step 3/3 : CMD ["world"] ---> Running in 3826cda9251a Removing intermediate container 3826cda9251a ---> 5acc8a29cae8 Successfully built 5acc8a29cae8 Successfully tagged entrytest:latest [root@master Monitor]# docker run entrytest hello world [root@master Monitor]# docker run entrytest yun hello yun
7.注意事項
1.如果不指定Dockerfile文件,Dockerfile的命名必須為Dockerfile。大小寫不能變。
2.構(gòu)建鏡像的時候要看好你的文件是不是這個目錄,要不然打到一半會報錯,說找不到文件,切記要記得放文件,在放文件的目錄執(zhí)行。
3.如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。但是ENTRYPOINT不會被docker run后面的命令覆蓋, 而且這些命令行參數(shù)會被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。
4. Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的參數(shù)替換。
5. 用 VOLUME 聲明了卷,那么以后對于卷內(nèi)容的修改會被丟棄,即在dockerfile構(gòu)建的時候無法再修改使用volume掛載出去的目錄,所以, 一定在volume聲明之前修改內(nèi)容 ;另外docker commit提交新鏡像的的時候也不會繼承之前鏡像的卷
到此這篇關(guān)于Dockerfile文件編寫實戰(zhàn)練習(xí)及注意事項的文章就介紹到這了,更多相關(guān)Dockerfile文件編寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker內(nèi)網(wǎng)穿透frp部署實現(xiàn)過程解析
這篇文章主要介紹了Docker內(nèi)網(wǎng)穿透frp部署實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11zabbix監(jiān)控docker容器狀態(tài)【推薦】
這篇文章主要介紹了zabbix監(jiān)控docker容器狀態(tài)的相關(guān)資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)
這篇文章主要介紹了基于Docker部署 Tomcat集群、 Nginx負(fù)載均衡,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09