Docker之DockerFile文件的使用及說明

一、DockerFile是什么
Dockerfile是用來構(gòu)建Docker鏡像的構(gòu)建文件,是由一系列命令和參數(shù)構(gòu)成的腳本。
構(gòu)建三步驟:編寫Dockerfile文件—docker build—docker run
Dockerfile文件什么樣?
以我們熟悉的CentOS為例:https://hub.docker.com/_/centos/

二、DockerFile構(gòu)建過程解析
2.1 Dockerfile內(nèi)容基礎(chǔ)知識
1:每條保留字指令都必須為大寫字母且后面要跟隨至少一個(gè)參數(shù)
2:指令按照從上到下,順序執(zhí)行
3:#表示注釋
4:每條指令都會創(chuàng)建一個(gè)新的鏡像層,并對鏡像進(jìn)行提交
2.2 Docker執(zhí)行Dockerfile的大致流程
(1)docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
(2)執(zhí)行一條指令并對容器作出修改
(3)執(zhí)行類似docker commit的操作提交一個(gè)新的鏡像層
(4)docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器
(5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
2.3 小總結(jié)
從應(yīng)用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個(gè)不同階段:Dockerfile是軟件的原材料、Docker鏡像是軟件的交付品、Docker容器則可以認(rèn)為是軟件的運(yùn)行態(tài)。
Dockerfile面向開發(fā),Docker鏡像成為交付標(biāo)準(zhǔn),Docker容器則涉及部署與運(yùn)維,三者缺一不可,合力充當(dāng)Docker體系的基石。

1、Dockerfile,需要定義一個(gè)Dockerfile,Dockerfile定義了進(jìn)程需要的一切東西。Dockerfile涉及的內(nèi)容包括執(zhí)行代碼或者是文件、環(huán)境變量、依賴包、運(yùn)行時(shí)環(huán)境、動態(tài)鏈接庫、操作系統(tǒng)的發(fā)行版、服務(wù)進(jìn)程和內(nèi)核進(jìn)程(當(dāng)應(yīng)用進(jìn)程需要和系統(tǒng)服務(wù)和內(nèi)核進(jìn)程打交道,這時(shí)需要考慮如何設(shè)計(jì)namespace的權(quán)限控制)等;
2、Docker鏡像,在用Dockerfile定義一個(gè)文件之后,docker build時(shí)會產(chǎn)生一個(gè)Docker鏡像,當(dāng)運(yùn)行Docker鏡像時(shí),會真正開始提供服務(wù);
3、Docker容器,容器是直接提供服務(wù)的。
三、DockerFile體系結(jié)構(gòu)
3.1保留字指令
- FROM:基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的
- MAINTAINER:鏡像維護(hù)者的姓名和郵箱地址
- RUN:容器構(gòu)建時(shí)需要運(yùn)行的命令
- EXPOSE:當(dāng)前容器對外暴露出的端口
- WORKDIR:指定在創(chuàng)建容器后,終端默認(rèn)登陸的進(jìn)來工作目錄,一個(gè)落腳點(diǎn)
- ENV:用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
ENV MY_PATH/usr/mytest
這個(gè)環(huán)境變量可以在后續(xù)的任何RUN指令中使用,這就如同在命令前面指定了環(huán)境變量前綴一樣;也可以在其它指令中直接使用這些環(huán)境變量,比如:WORKDIR $MY_PATH
- ADD:將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像且ADD命令會自動處理URL和解壓tar壓縮包
- COPY:類似ADD,拷貝文件和目錄到鏡像中。將從構(gòu)建上下文目錄中<源路徑>的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的<目標(biāo)路徑>位置
COPY src dest COPY ["src", "dest"]
- VOLUME:容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
- CMD:指定一個(gè)容器啟動時(shí)要運(yùn)行的命令

Dockerfile中可以有多個(gè)CMD指令,但只有最后一個(gè)生效,CMD會被docker run之后的參數(shù)替換。
- ENTRYPOINT:指定一個(gè)容器啟動時(shí)要運(yùn)行的命令
- ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動程序及參數(shù)
- ONBUILD:當(dāng)構(gòu)建一個(gè)被繼承的Dockerfile時(shí)運(yùn)行命令,父鏡像在被子繼承后父鏡像的onbuild被觸發(fā)。


3.2 小結(jié)

四、案例
4.1Base鏡像(scratch)
Docker Hub中99%的鏡像都是通過在base鏡像中安裝和配置需要的軟件構(gòu)建出來的。

4.2 自定義鏡像mycentos
1)編寫
Hub默認(rèn)CentOS鏡像什么情況

自定義mycentos目的使我們自己的鏡像具備如下:
登陸后的默認(rèn)路徑、vim編輯器、查看網(wǎng)絡(luò)配置ifconfig支持
準(zhǔn)備編寫DockerFile文件

myCentOS內(nèi)容DockerFile

FROM centos MAINTAINER zzyy<zzyy167@126.com> ? ENV MYPATH /usr/local WORKDIR $MYPATH ? RUN yum -y install vim RUN yum -y install net-tools ? EXPOSE 80 ? CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
2)構(gòu)建
docker build -t 新鏡像名字:TAG .
會看到docker build命令最后有一個(gè). .表示當(dāng)前目錄


3)運(yùn)行
docker run -it 新鏡像名字:TAG
我們自己的新鏡像已經(jīng)支持vim/ifconfig命令,擴(kuò)展成功了。

4)列出鏡像的變更歷史
docker history 鏡像名
4.3 CMD/ENTRYPOINT鏡像案例
都是指定一個(gè)容器啟動時(shí)要運(yùn)行的命令
CMD:Dockerfile中可以有多個(gè)CMD指令,但只有最后一個(gè)生效,CMD會被docker run之后的參數(shù)替換。
tomcat的講解演示:
docker run -it -p 8888:8080 tomcat ls -l
ENTRYPOINT:docker run之后的參數(shù)會被當(dāng)做參數(shù)傳遞給ENTRYPOINT,之后形成新的命令組合。

制作CMD版可以查詢IP信息的容器
FROM centos RUN yum install -y curl CMD [ "curl", "-s", "http://ip.cn" ]

制作ENTROYPOINT版查詢IP信息的容器
FROM centos RUN yum install -y curl ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

4.4 自定義鏡像Tomcat9
1)mkdir -p /zzyyuse/mydockerfile/tomcat9
2)在上述目錄下touch c.txt
3)將jdk和tomcat安裝的壓縮包拷貝進(jìn)上一步目錄
apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz


4)在/zzyyuse/mydockerfile/tomcat9目錄下新建Dockerfile文件
FROM centos MAINTAINER zzyy<zzyybs@126.com> #把宿主機(jī)當(dāng)前上下文的c.txt拷貝到容器/usr/local/路徑下 COPY c.txt /usr/local/cincontainer.txt #把java與tomcat添加到容器中 ADD jdk-8u171-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.8.tar.gz /usr/local/ #安裝vim編輯器 RUN yum -y install vim #設(shè)置工作訪問時(shí)候的WORKDIR路徑,登錄落腳點(diǎn) ENV MYPATH /usr/local WORKDIR $MYPATH #配置java與tomcat環(huán)境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_171 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器運(yùn)行時(shí)監(jiān)聽的端口 EXPOSE 8080 #啟動時(shí)運(yùn)行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out
目錄內(nèi)容

5)構(gòu)建

構(gòu)建完成

6)run運(yùn)行
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9

7)備注
Docker掛載主機(jī)目錄Docker訪問出現(xiàn)cannot open directory .: Permission denied。
解決辦法:在掛載目錄后多加一個(gè)--privileged=true參數(shù)即可
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決docker容器重啟之后/etc下某些配置文件被重置的問題
這篇文章主要介紹了解決docker容器重啟之后/etc下某些配置文件被重置的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
docker實(shí)踐之docker-compose部署mysql方式
這篇文章主要介紹了docker實(shí)踐之docker-compose部署mysql方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
替換docker容器中的一個(gè)文件的實(shí)現(xiàn)
在某些情況下,我們可能確實(shí)需要更新容器內(nèi)的文件,本文主要介紹了替換docker容器中的一個(gè)文件的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Docker使用Qwen2.5-0.5B-Instruct搭建個(gè)人專屬AI聊天機(jī)器人
本文介紹了如何在星圖GPU平臺上自動化部署Qwen2.5-0.5B-Instruct鏡像,快速搭建個(gè)人專屬AI聊天機(jī)器人,通過簡單的Docker命令即可完成部署,實(shí)現(xiàn)智能對話功能,感興趣的可以了解一下2026-04-04
Docker 部署 Microsoft SQL Server 完全指南
本文詳細(xì)介紹如何使用Docker快速部署Microsoft SQL Server,提供兩種主流方式,兩種方式都包含了數(shù)據(jù)持久化、資源限制等生產(chǎn)環(huán)境所需的配置,并提供了詳細(xì)的參數(shù)說明和常見問題解決方法,感興趣的朋友跟隨小編一起看看吧2025-08-08

