目錄
?1.是什么???
2.構(gòu)建三步驟
3.DockerFile構(gòu)建過程解析
3.1 Dockerfile內(nèi)容基礎(chǔ)知識(shí)
3.2Docker執(zhí)行Dockerfile的大致流程
? 總結(jié)
4.DockerFile常用保留字指令
5.案例:自定義鏡像
?5.1 要求:?Centos7鏡像具備vim+ifconfig+jdk8
?5.2編寫
5.3 準(zhǔn)備編寫Dockerfile文件??大寫字母D
5.3構(gòu)建
5.4再體會(huì)下UnionFS(聯(lián)合文件系統(tǒng))
6.虛懸鏡像
6.1是什么 ???
6.2查看?
6.3刪除?
作業(yè)-自定義鏡像myubuntu?
?
?1.是什么???
Dockerfile是用來構(gòu)建Docker鏡像的文本文件,是由一條條構(gòu)建鏡像所需的指令和參數(shù)構(gòu)成的腳本。
?Dockerfile reference | Docker Docs
2.構(gòu)建三步驟
編寫Dockerfile文件
docker build命令構(gòu)建鏡像
docker run依鏡像運(yùn)行容器實(shí)例
3.DockerFile構(gòu)建過程解析
3.1 Dockerfile內(nèi)容基礎(chǔ)知識(shí)
1:每條保留字指令都必須為大寫字母且后面要跟隨至少一個(gè)參數(shù)
2:指令按照從上到下,順序執(zhí)行
3:#表示注釋
4:每條指令都會(huì)創(chuàng)建一個(gè)新的鏡像層并對(duì)鏡像進(jìn)行提交
3.2Docker執(zhí)行Dockerfile的大致流程
(1)docker從基礎(chǔ)鏡像運(yùn)行一個(gè)容器
(2)執(zhí)行一條指令并對(duì)容器作出修改
?(3)執(zhí)行類似docker commit的操作提交一個(gè)新的鏡像層
(4)docker再基于剛提交的鏡像運(yùn)行一個(gè)新容器
(5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
? 總結(jié)
從應(yīng)用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個(gè)不同階段,
* ?Dockerfile是軟件的原材料
* ?Docker鏡像是軟件的交付品
* ?Docker容器則可以認(rèn)為是軟件鏡像的運(yùn)行態(tài),也即依照鏡像運(yùn)行的容器實(shí)例
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)境、動(dòng)態(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í)會(huì)產(chǎn)生一個(gè)Docker鏡像,當(dāng)運(yùn)行 Docker鏡像時(shí)會(huì)真正開始提供服務(wù);
?
3 Docker容器,容器是直接提供服務(wù)的。
4.DockerFile常用保留字指令
參考tomcat8的dockerfile入門??GitHub - docker-library/tomcat: Docker Official Image packaging for Apache Tomcat
FROM
基礎(chǔ)鏡像,當(dāng)前新鏡像是基于哪個(gè)鏡像的,指定一個(gè)已經(jīng)存在的鏡像作為模板,第一條必須是from
MAINTAINER
鏡像維護(hù)者的姓名和郵箱地址
RUN?
容器構(gòu)建時(shí)需要運(yùn)行的命令
兩種格式?
shell格式
?
RUN yum -y install vim
exec格式
RUN是在 docker build時(shí)運(yùn)行
EXPOSE
當(dāng)前容器對(duì)外暴露出的端口
WORKDIR
指定在創(chuàng)建容器后,終端默認(rèn)登陸的進(jìn)來工作目錄,一個(gè)落腳點(diǎn)
USER
指定該鏡像以什么樣的用戶去執(zhí)行,如果都不指定,默認(rèn)是root
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)鏡像且會(huì)自動(dòng)處理URL和解壓tar壓縮包
?COPY
類似ADD,拷貝文件和目錄到鏡像中。
將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置
?VOLUME
容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
CMD
指定容器啟動(dòng)后的要干的事情
注意
Dockerfile 中可以有多個(gè) CMD 指令,但只有最后一個(gè)生效,CMD 會(huì)被 docker run 之后的參數(shù)替換
參考官網(wǎng)Tomcat的dockerfile演示講解
?它和前面RUN命令的區(qū)別
CMD是在docker run 時(shí)運(yùn)行。RUN是在 docker build時(shí)運(yùn)行
ENTRYPOINT
也是用來指定一個(gè)容器啟動(dòng)時(shí)要運(yùn)行的命令
類似于 CMD 指令,但是ENTRYPOINT不會(huì)被docker run后面的命令覆蓋,
而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序
?
是否傳參?? ?按照dockerfile編寫執(zhí)行?? ?傳參運(yùn)行
Docker命令?? ?docker run ?nginx:test?? ?docker run ?nginx:test -c /etc/nginx/new.conf
衍生出的實(shí)際命令?? ?nginx -c /etc/nginx/nginx.conf?? ?nginx -c /etc/nginx/new.conf?優(yōu)點(diǎn) :?
在執(zhí)行docker run的時(shí)候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。
注意:
如果 Dockerfile 中如果存在多個(gè) ENTRYPOINT 指令,僅最后一個(gè)生效。
5.案例:自定義鏡像
?5.1 要求:?Centos7鏡像具備vim+ifconfig+jdk8
JDK的下載鏡像地址:小柒博客 | 開源軟件鏡像站
?5.2編寫
5.3 準(zhǔn)備編寫Dockerfile文件??大寫字母D
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看網(wǎng)絡(luò)IP
RUN yum -y install net-tools
#安裝java8及l(fā)ib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對(duì)路徑j(luò)ar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安裝包必須要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java環(huán)境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
5.3構(gòu)建
docker build -t 新鏡像名字:TAG .
?注意,上面TAG后面有個(gè)空格,有個(gè)點(diǎn)
運(yùn)行
docker run -it 新鏡像名字:TAG
?docker run -it centosjava8:1.5 /bin/bash
5.4再體會(huì)下UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級(jí)并且高性能的文件系統(tǒng),它支持對(duì)文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎(chǔ)。鏡像可以通過分層來進(jìn)行繼承,基于基礎(chǔ)鏡像(沒有父鏡像),可以制作各種具體的應(yīng)用鏡像。
特性:一次同時(shí)加載多個(gè)文件系統(tǒng),但從外面看起來,只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會(huì)包含所有底層的文件和目錄
6.虛懸鏡像
6.1是什么 ???
倉庫名、標(biāo)簽都是<none>的鏡像,俗稱dangling image
1 vim Dockerfile
from ubuntu
CMD echo 'action is success'
2 docker build .
6.2查看?
docker image ls -f dangling=true
命令結(jié)果
6.3刪除?
docker image prune
?
虛懸鏡像已經(jīng)失去存在價(jià)值,可以刪除
作業(yè)-自定義鏡像myubuntu?
?編寫:準(zhǔn)備編寫DockerFile文件
FROM ubuntu
MAINTAINER zzyy<zzyybs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN apt-get update
RUN apt-get install net-tools
#RUN apt-get install -y iproute2
#RUN apt-get install -y inetutils-ping
EXPOSE 80
CMD echo $MYPATH
CMD echo "install inconfig cmd into ubuntu success--------------ok"
CMD /bin/bash
構(gòu)建?文章來源:http://www.zghlxwxcb.cn/news/detail-693772.html
docker build -t 新鏡像名字:TAG .
運(yùn)行文章來源地址http://www.zghlxwxcb.cn/news/detail-693772.html
docker run -it 新鏡像名字:TAG
到了這里,關(guān)于docker 筆記6:高級(jí)篇 DockerFile解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!