Dockerfile中的保留字指令的過程解析
之前簡單學(xué)過Docker,當(dāng)時(shí)是為了快速部署一個(gè)項(xiàng)目,過的很快,對于Dockerfile文件的編寫,有些顯的陌生。
所以就寫了這篇文章。希望能夠幫助到大家哦!?。?/p>
一、Dockerfile是什么?
概念:
Dockerfile是用來構(gòu)建Docker鏡像的構(gòu)建文件,由一系列命令和參數(shù)構(gòu)成的腳本
構(gòu)建三步驟:
- 編寫Dockerfile文件
- docker build
- docker run
Centos案例:
centos案例:
FROM scratch #真正的基礎(chǔ)鏡像, ADD centos-7-x86_64-docker.tar.xz / # label 說明的意思 LABEL \ org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20201113" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-11-13 00:00:00+00:00" CMD ["/bin/bash"] #最后一行執(zhí)行的命令
在哪找到的勒,在hub.docker.com上找到滴:centos。
我們不會,但是可以先去看看人家怎么寫的,抄作業(yè)這事,我想大家都熟悉吧。俗稱CV大法😂。
二、Dockerfile構(gòu)建過程分析
入門知識:
每條保留字指令(今天的重點(diǎn))都必須為大寫字母
并且后面要跟隨至少一個(gè)參數(shù)
。
如:
FROM scratch #真正的基礎(chǔ)鏡像, ADD centos-7-x86_64-docker.tar.xz /
指令按照從上到下,順序執(zhí)行
#
表示注釋。
#這就是注釋
每條指令都會創(chuàng)建一個(gè)新的鏡像層,并對鏡像進(jìn)行提交。
就如下面這樣,可以套娃一樣。
Dockerfile執(zhí)行流程分析:docker
從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
- 執(zhí)行一條指令并對容器作出修改
- 執(zhí)行類似
docker commit
的操作提交一個(gè)新的鏡像層。 docker
再基于剛提交的鏡像運(yùn)行一個(gè)新容器- 執(zhí)行
dockerfile
中的下一條指令直到所有指令都執(zhí)行完成
后文有案例,結(jié)合案例回過來看更容易理解。
小小番外:
- 在現(xiàn)階段,我們將
Dockerfile
、Docker
鏡像和Docker
容器看待為軟件的三個(gè)不同階段。 Dockerfile
面向開發(fā)--->Docker鏡像成為交付標(biāo)準(zhǔn)--->Docker容器則涉及部署與運(yùn)維- 在
Dockerfile
中定義了進(jìn)程所需要的一切東西,以前需要依賴的環(huán)境變量、依賴包、運(yùn)行時(shí)環(huán)境等都被寫入到Dockerfile
文件中啦。比起之前你在Liunx服務(wù)器中,下載那么那么多軟件,配置那么那么多,真的是簡單蠻多,起碼對于我這個(gè)菜雞來說用Docker部署真的簡單了蠻多的。 Docker
鏡像是在用Dockerfile
定義了一個(gè)文件后,docker build 時(shí)產(chǎn)生的一個(gè)Docker鏡像,當(dāng)運(yùn)行時(shí)Docker
鏡像時(shí),才會真正開始提供服務(wù)。
Docker容器就是運(yùn)行起來即可提供服務(wù)的。
三、Dockerfile保留字指令
Dockerfiel保留字指令大致有以下:
- FROM
- MAINTANINER
- RUN
- EXPOSE
- WORKDIR
- ENV
- ADD
- COPY
- VOLUME
- CMD
- ENTRYPOINT
- ONBUILD
3.1、FROM
基礎(chǔ)鏡像,即當(dāng)前新鏡像是基于哪個(gè)鏡像創(chuàng)建的。
#基于openjdk:8 創(chuàng)建鏡像 FROM openjdk:8
3.2、MAINTAINER
鏡像維護(hù)者的姓名和郵箱地址
MAINTAINER 寧在春crush@163.com
3.3、RUN
容器構(gòu)建時(shí)需要運(yùn)行的指令
RUN mkdir -p /conf/my.cn
3.4、EXPOSE
當(dāng)前容器對外暴露的端口
#暴露出MyCat的所需端口 EXPOSE 8066 9066
3.5、WORKDIR
指定在創(chuàng)建容器后,終端默認(rèn)登錄的進(jìn)來工作目錄
#容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作 WORKDIR /usr/local/mycat
3.6、ENV
用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量
#用來在構(gòu)建鏡像過程中設(shè)置環(huán)境變量ENV MYCAT_HOME=/usr/local/mycat
這個(gè)環(huán)境變量可以在后續(xù)的任何RUN指令中使用,這就如同在命令前面指定了環(huán)境變量前綴一樣;也可以在其它指令中直接使用這些環(huán)境變量。
如:
RUN $MYCAT_HOME/mycat
3.7、ADD 和 COPY
ADD:
將宿主機(jī)目錄下的文件拷貝進(jìn)鏡像,并且ADD命令會自動(dòng)處理URL和解壓tar壓縮包
ADD centos-6-docker.tar.xz /
COPY:
類似ADD,拷貝文件和目錄到鏡像中。
將從構(gòu)建上下文目錄中<源路徑>的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的<目標(biāo)路徑>位置
COPY src destCOPY ["src" "dest"]
3.8、VOLUME
容器數(shù)據(jù)卷,用于數(shù)據(jù)持久化和數(shù)據(jù)保存。
#將mycat的配置文件的地址暴露出映射地址,啟動(dòng)時(shí)直接映射宿主機(jī)的文件夾VOLUME /usr/local/mycat
3.9、CMD 和 ENTRYPOINT
CMD
CMD的指令和RUN相似,也是兩種格式:
shell
格式:CMD<命令>exec
格式:CMD ["可執(zhí)行文件“,”參數(shù)1“,”參數(shù)2“.....]
Dockerfile
中可以有多個(gè)CMD指令,但只有最后一個(gè)生效,CMD會被docker run
之后的參數(shù)替換。
ENTRYPOINT
指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令。
ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動(dòng)程序及參數(shù)。
區(qū)別:
在這里先簡單說明一下區(qū)別,你可以將CMD理解為覆蓋
CMD cat /conf/my.cnfCMD /bin/bash
這兩條指令都寫在Dockerfile
文件中,只會執(zhí)行CMD /bin/bash ,而不會執(zhí)行CMD cat /conf/my.cnf
,因?yàn)?code>CMD /bin/bash把上一條直接覆蓋掉了。
而ENTRYPOINT
則不同,你可以將ENTRYPOINT
簡單理解為追加。
主要體現(xiàn)在docker run
上,如果使用dockerfile
文件中最后是CMD
結(jié)尾,則在運(yùn)行時(shí)不能夠額外追加命令,否則會覆蓋掉Dockerfile
中的CMD
命令。
而Dockerfile
文件中最后一行為ENTRYPOINT
結(jié)尾時(shí),你可以在docker run
命令后追加一些命令.
3.10、ONBUILD
當(dāng)構(gòu)建一個(gè)被繼承的Dockerfile
時(shí)運(yùn)行命令,父鏡像在被子繼承后,父鏡像的onbuild
被觸發(fā)。
四、實(shí)戰(zhàn)案例
4.1、制作一個(gè)自己的Centos鏡像
4.1.1、引入:
我們先從阿里云上拉取一個(gè)centos看看,看看有哪些問題,然后我們再進(jìn)行自定義。
docker pull centos # 拉取鏡像docker run -it centos #運(yùn)行鏡像# ===== 測試====vim ceshi.txtifconfig pwd
為什么會這樣?因?yàn)閐ocker倉庫中的Centos是精簡版,其只有內(nèi)核,沒有其它的東西。
要求自定義的Centos能夠解決上述問題。
4.1.2、編寫Dockerfile文件
為我們自定義的Centos 編寫Dockerfile文件
FROM centosMAINTAINER 寧在春<crush@163.com>ENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vimRUN yum -y install net-toolsEXPOSE 80 CMD echo $MYPATHCMD echo "success"CMD /bin/bash #只會運(yùn)行最后一個(gè)
然后把這個(gè)復(fù)制進(jìn)去即可。
mkdir -p /usr/local/docker/mycentos # 自己創(chuàng)建存放的位置vim Dockerfile
4.1.3、構(gòu)建centos鏡像
docker build -f /usr/local/docker/mycentos/Dockerfile -t mycentos:1.1 .
解釋:
- -f:后面跟隨的是Dockerfile 文件
- -t :后面跟隨的鏡像名和版本號。
- 最后的小數(shù)點(diǎn):就表明是當(dāng)前目錄。
- docker build -f Dockerfile文件 -t 鏡像名:tag .
- 當(dāng)dockerfile文件命名為dockerfile時(shí)并且在當(dāng)前目錄下時(shí)可簡寫為:
- docker build -t 鏡像名:tag .docker build -t mycentos:1.1 .
執(zhí)行:
看到最后的這個(gè)就是代表成功了。
docker images
查看全部鏡像:
4.1.4、運(yùn)行Centos鏡像
docker run -it mycentos:1.3pwdifconfig
之所以我們進(jìn)去容器的目錄會從/
切換到/usr/local
是因?yàn)樵赿ockerfile文件中已經(jīng)寫明。
ENV MYPATH /usr/localWORKDIR $MYPATH
4.1.5、查看鏡像的變更歷史
docker history mycentos:1.1
在這里也可以看出來,鏡像它是由Dockerfile文件中的指令,一層一層構(gòu)建出來的。
4.2、ONBUILD示例
率先構(gòu)建一個(gè)夫鏡像
編寫dockerfile
文件,命名為dockerfile2
FROM centosRUN yum -y install curlONBUILD RUN echo "我被子鏡像繼承了,輸出此條語句"CMD ["crul", "-s","http://ip.cn"]
docker build -f /usr/local/docker/mycentos/Dockerfile2 -t my_father_centos .
構(gòu)建一個(gè)鏡像繼承夫鏡像
編寫dockerfile
文件,命名為dockerfile3
哈
FROM my_father_centosRUN yum -y install curlCMD ["crul", "-s","http://ip.cn"] docker build -f /usr/local/docker/mycentos/Dockerfile3 -t my_son_centos .
可以看到父鏡像中的語句被輸出了。
到此這篇關(guān)于Dockerfile中的保留字指令講解的文章就介紹到這了,更多相關(guān)Dockerfile保留字指令內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持本站!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。