docker-6-DockerFile解析
阿新 • • 發佈:2019-02-18
rfi 基於 原材料 mission poi 頭信息 tail cas 自然
Dockerfile 中可以有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 之後的參數替換
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 指定一個容器啟動時要運行的命令
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.ou5、構建 6、run Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied 解決辦法:在掛載目錄後多加一個--privileged=true參數即可 7、驗證 8、結合前述的容器卷將測試的web服務test發布
docker-6-DockerFile解析