1. 程式人生 > >docker-6-DockerFile解析

docker-6-DockerFile解析

rfi 基於 原材料 mission poi 頭信息 tail cas 自然

1、是什麽

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。

技術分享圖片

構建三步驟: 1、編寫Dockerfile文件 2、docker build 3、docker run 文件什麽樣??? 以我們熟悉的CentOS為例 https://hub.docker.com/_/centos/

2、DockerFile構建過程解析

2.1、Dockerfile內容基礎知識 1:每條保留字指令都必須為大寫字母且後面要跟隨至少一個參數 2:指令按照從上到下,順序執行 3:#表示註釋 4:每條指令都會創建一個新的鏡像層,並對鏡像進行提交

2.2、Docker執行Dockerfile的大致流程 (1)docker從基礎鏡像運行一個容器 (2)執行一條指令並對容器作出修改 (3)執行類似docker commit的操作提交一個新的鏡像層 (4)docker再基於剛提交的鏡像運行一個新容器 (5)執行dockerfile中的下一條指令直到所有指令都執行完成

2.3、小總結 從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別代表軟件的三個不同階段, * Dockerfile是軟件的原材料 * Docker鏡像是軟件的交付品 * Docker容器則可以認為是軟件的運行態。 Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。 1、 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了進程需要的一切東西。 Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、 服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等; 2 、Docker鏡像,在用Dockerfile定義一個文件之後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務; 3、 Docker容器,容器是直接提供服務的。

技術分享圖片

3、DockerFile體系結構(保留字指令)

3.1、FROM 基礎鏡像,當前新鏡像是基於哪個鏡像的 3.2、MAINTAINER 鏡像維護者的姓名和郵箱地址 3.3、RUN 容器構建時需要運行的命令 3.4、EXPOSE 當前容器對外暴露出的端口 3.5、WORKDIR 指定在創建容器後,終端默認登陸的進來工作目錄,一個落腳點 3.6、ENV 用來在構建鏡像過程中設置環境變量

技術分享圖片

3.7、ADD 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包 3.8、COPY 類似ADD,拷貝文件和目錄到鏡像中。 將從構建上下文目錄中 <源路徑> 的文件/目錄復制到新的一層的鏡像內的 <目標路徑> 位置 COPY src dest COPY ["src", "dest"] 3.9、VOLUME 容器數據卷,用於數據保存和持久化工作 3.10、CMD 指定一個容器啟動時要運行的命令
Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換

3.11、ENTRYPOINT 指定一個容器啟動時要運行的命令 ENTRYPOINT 的目的和 CMD 一樣,都是在指定容器啟動程序及參數 3.12、ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發 小總結

技術分享圖片

4、案例

4.1、Base鏡像(scratch) Docker Hub 中 99% 的鏡像都是通過在 base 鏡像中安裝和配置需要的軟件構建出來的 4.2、自定義鏡像mycentos 4.2.1、編寫 Hub默認CentOS鏡像什麽情況 自定義mycentos目的使我們自己的鏡像具備如下: 登陸後的默認路徑 vim編輯器 查看網絡配置ifconfig支持

技術分享圖片

準備編寫DockerFile文件

技術分享圖片

myCentOS內容DockerFile2 FROM centosMAINTAINER zzyy<[email protected]> ENV MYPATH /usr/localWORKDIR $MYPATH RUN yum -y install vimRUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATHCMD echo "success--------------ok"CMD /bin/bash 4.2.2、構建 docker build -t 新鏡像名字:TAG .

技術分享圖片

安裝成功之後:

技術分享圖片

技術分享圖片

4.2.3、運行 docker run -it 新鏡像名字:TAG 可以看到,我們自己的新鏡像已經支持vim/ifconfig命令,擴展成功了。

技術分享圖片

技術分享圖片

4.2.4、列出鏡像的變更歷史 docker history 鏡像名

技術分享圖片

[root@MrChengs 桌面]# docker history 774a8af7e1a5
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
774a8af7e1a5        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/b   0 B                 
49f67d3823f9        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo \   0 B                 
6da0097c48b1        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo $   0 B                 
68582740acb5        5 hours ago         /bin/sh -c #(nop) EXPOSE 80/tcp                 0 B                 
d382b224d129        5 hours ago         /bin/sh -c yum -y install net-tools             24.17 MB            
d4506485018a        5 hours ago         /bin/sh -c yum -y install vim                   125.7 MB            
e3f551ceea22        5 hours ago         /bin/sh -c #(nop) WORKDIR /usr/local            0 B                 
703b1f226717        5 hours ago         /bin/sh -c #(nop) ENV MYPATH=/usr/local         0 B                 
5650d63ecf94        5 hours ago         /bin/sh -c #(nop) MAINTAINER ccrr<1287221322@   0 B                 
ab9a80ab07d0        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
f016d310caa9        4 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B                 
e4b082fc6cdb        4 weeks ago         /bin/sh -c #(nop) ADD file:6f877549795f4798a3   201.8 MB  

 順著加載倒著執行!!! 

4.3、CMD/ENTRYPOINT 鏡像案例 4.3.1、都是指定一個容器啟動時要運行的命令 4.3.2、CMD Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換 Case:tomcat的講解演示-----docker run -it -p 8888:8080 tomcat ls -l

技術分享圖片

docker run -it -p 7777:8080 tomcat ls -l 說明只是最後一行命令生效根據:DockersFile文件配置 並沒有啟動tomcat

技術分享圖片

4.3.3、ENTRYPOINT docker run 之後的參數會被當做參數傳遞給 ENTRYPOINT,之後形成新的命令組合 命令會被追加 Case: 制作CMD版可以查詢IP信息的容器:
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]

crul命令解釋:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

問題:如果我們希望顯示 HTTP 頭信息,就需要加上 -i 參數 WHY: 我們可以看到可執行文件找不到的報錯,executable file not found。 之前我們說過,跟在鏡像名後面的是 command,運行時會替換 CMD 的默認值。 因此這裏的 -i 替換了原來的 CMD,而不是添加在原來的 curl -s http://ip.cn 後面。而 -i 根本不是命令, 所以自然找不到。 那麽如果我們希望加入 -i 這參數,我們就必須重新完整的輸入這個命令: $ docker run myip curl -s http://ip.cn -i

技術分享圖片

制作ENTROYPOINT版查詢IP信息的容器:

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

技術分享圖片

ONBUILD:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

自定義鏡像Tomcat9 1、mkdir -p /ccrr/mydockerfile/tomcat9 2、在上述目錄下touch c.txt

技術分享圖片

3、將jdk和tomcat安裝的壓縮包拷貝進上一步目錄

技術分享圖片

apache-tomcat-9.0.8.tar.gz jdk-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/localWORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME  /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV  
CATALINA_HOME /usr/local/apache-tomcat-9.0.8ENV CATALINA_BASE  /usr/local/apache-tomcat-9.0.8ENV PATH  $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#容器運行時監聽的端口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.ou
5、構建 6、run Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied 解決辦法:在掛載目錄後多加一個--privileged=true參數即可 7、驗證 8、結合前述的容器卷將測試的web服務test發布

docker-6-DockerFile解析