Docker之DockerFile文件的使用及說明

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

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

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

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


3.2 小結

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

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

自定義mycentos目的使我們自己的鏡像具備如下:
登陸后的默認路徑、vim編輯器、查看網(wǎng)絡配置ifconfig支持
準備編寫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)構建
docker build -t 新鏡像名字:TAG .
會看到docker build命令最后有一個. .表示當前目錄


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

4)列出鏡像的變更歷史
docker history 鏡像名
4.3 CMD/ENTRYPOINT鏡像案例
都是指定一個容器啟動時要運行的命令
CMD:Dockerfile中可以有多個CMD指令,但只有最后一個生效,CMD會被docker run之后的參數(shù)替換。
tomcat的講解演示:
docker run -it -p 8888:8080 tomcat ls -l
ENTRYPOINT:docker run之后的參數(shù)會被當做參數(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安裝的壓縮包拷貝進上一步目錄
apache-tomcat-9.0.8.tar.gzjdk-8u171-linux-x64.tar.gz


4)在/zzyyuse/mydockerfile/tomcat9目錄下新建Dockerfile文件
FROM centos MAINTAINER zzyy<zzyybs@126.com> #把宿主機當前上下文的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 #設置工作訪問時候的WORKDIR路徑,登錄落腳點 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 #容器運行時監(jiān)聽的端口 EXPOSE 8080 #啟動時運行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)構建

構建完成

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

