1、構(gòu)建三步驟
·編寫Dockerfile文件
·docker build命令構(gòu)建鏡像
·docker run依鏡像運行容器實例
2、DockerFile構(gòu)建過程解析
·Dockerfile內(nèi)容基礎知識
·1:每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數(shù)
·2:指令按照從上到下,順序執(zhí)行
·3:#表示注釋
·4:每條指令都會創(chuàng)建一個新的鏡像層并對鏡像進行提交
·Docker執(zhí)行Dockerfile的大致流程
·(1)docker從基礎鏡像運行一個容器
·(2)執(zhí)行一條指令并對容器作出修改
·(3)執(zhí)行類似docker commit的操作提交一個新的鏡像層
·(4)docker再基于剛提交的鏡像運行一個新容器
·(5)執(zhí)行dockerfile中的下一條指令直到所有指令都執(zhí)行完成
從應用軟件的角度來看,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的權(quán)限控制)等等;
2 Docker鏡像,在用Dockerfile定義一個文件之后,docker build時會產(chǎn)生一個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務;
3 Docker容器,容器是直接提供服務的。
3、DockerFile常用保留字指令
·FROM
·基礎鏡像,當前新鏡像是基于哪個鏡像的,指定一個已經(jīng)存在的鏡像作為模板,第一條必須from
MAINTAINER
·鏡像維護者的姓名和郵箱地址
·RUN
·容器構(gòu)建時需要運行的命令
·兩種格式
·shell格式
RUN yum -y install vim
exec格式
·RUN是在 docker build時運行
·EXPOSE
·當前容器對外暴露出的端口
·WORKDIR
·指定在創(chuàng)建容器后,終端默認登陸的進來工作目錄,一個落腳點
·USER
·指定該鏡像以什么樣的用戶去執(zhí)行,如果都不指定,默認是root
·ENV
·用來在構(gòu)建鏡像過程中設置環(huán)境變量
ENV MY_PATH /usr/mytest
這個環(huán)境變量可以在后續(xù)的任何RUN指令中使用,這就如同在命令前面指定了環(huán)境變量前綴一樣;
也可以在其它指令中直接使用這些環(huán)境變量,
比如:WORKDIR $MY_PATH
·ADD
·將宿主機目錄下的文件拷貝進鏡像且會自動處理URL和解壓tar壓縮包
·COPY
·類似ADD,拷貝文件和目錄到鏡像中。 將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復制到新的一層的鏡像內(nèi)的 <目標路徑> 位置
·COPY src dest
·COPY [“src”, “dest”]
·<src源路徑>:源文件或者源目錄
·<dest目標路徑>:容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創(chuàng)建。
·VOLUME
·容器數(shù)據(jù)卷,用于數(shù)據(jù)保存和持久化工作
·CMD
·指定容器啟動后的要干的事情
·Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效,CMD 會被 docker run 之后的參數(shù)替換
·它和前面RUN命令的區(qū)別
·CMD是在docker run 時運行。
·RUN是在 docker build時運行。
·ENTRYPOINT
·也是用來指定一個容器啟動時要運行的命令
·類似于 CMD 指令,但是ENTRYPOINT不會被docker run后面的命令覆蓋, 而且這些命令行參數(shù)會被當作參數(shù)送給 ENTRYPOINT 指令指定的程序
ENTRYPOINT可以和CMD一起用,一般是變參才會使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參。
當指定了ENTRYPOINT后,CMD的含義就發(fā)生了變化,不再是直接運行其命令而是將CMD的內(nèi)容作為參數(shù)傳遞給ENTRYPOINT指令
·在執(zhí)行docker run的時候可以指定 ENTRYPOINT 運行所需的參數(shù)。
·注意
·如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。
4、自定義鏡像mycentosjava8
·要求
·Centos7鏡像具備vim+ifconfig+jdk8
·JDK的下載鏡像地址
·官網(wǎng)
下載地址:
https://www.oracle.com/java/technologies/downloads/#java8
·編寫
·準備編寫Dockerfile文件
FROM centos:7
MAINTAINER zzyy
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看網(wǎng)絡IP
RUN yum -y install net-tools
#安裝java8及l(fā)ib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相對路徑jar,把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
·docker build -t 新鏡像名字:TAG .
docker build -t centosjava8:1.5 .
·注意,上面TAG后面有個空格,有個點
·運行
·docker run -it 新鏡像名字:TAG
docker run -it centosjava8:1.5 /bin/bash
5、再體會下UnionFS(聯(lián)合文件系統(tǒng))
UnionFS(聯(lián)合文件系統(tǒng)):Union文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng),它支持對文件系統(tǒng)的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬文件系統(tǒng)下(unite several directories into a single virtual filesystem)。Union 文件系統(tǒng)是 Docker 鏡像的基礎。鏡像可以通過分層來進行繼承,基于基礎鏡像(沒有父鏡像),可以制作各種具體的應用鏡像。
特性:一次同時加載多個文件系統(tǒng),但從外面看起來,只能看到一個文件系統(tǒng),聯(lián)合加載會把各層文件系統(tǒng)疊加起來,這樣最終的文件系統(tǒng)會包含所有底層的文件和目錄
·虛懸鏡像
倉庫名、標簽都是的鏡像,俗稱dangling image
·Dockerfile寫一個
vim Dockerfile
from ubuntu
CMD echo 'action is sucess'
#構(gòu)建
docker build .
查看
docker image ls -f dangling=true
刪除
docker image prune
虛懸鏡像已經(jīng)失去存在價值,可以刪除
文章來源:http://www.zghlxwxcb.cn/news/detail-686390.html
總結(jié)
文章來源地址http://www.zghlxwxcb.cn/news/detail-686390.html
到了這里,關于docker高級(DockerFile解析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!