20200206 Docker 6. DockerFile解析

Docker 6. DockerFile解析

是什麼

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

構建三步驟

  1. 編寫Dockerfile文件
  2. docker build
  3. docker run

文件什麼樣???

以咱們熟悉的CentOS爲例 ,tag爲latest, centos8, 8, centos8.1.1911, 8.1.1911的Dockerfile:linux

FROM scratch
ADD CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz  /

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="20200114" \
    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-01-14 00:00:00-08:00"

CMD ["/bin/bash"]

DockerFile構建過程解析

Dockerfile內容基礎知識

  1. 每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
  2. 指令按照從上到下,順序執行
  3. #表示註釋
  4. 每條指令都會建立一個新的鏡像層,並對鏡像進行提交

Docker執行Dockerfile的大體流程

  1. docker從基礎鏡像運行一個容器
  2. 執行一條指令並對容器做出修改
  3. 執行相似docker commit的操做提交一個新的鏡像層
  4. docker再基於剛提交的鏡像運行一個新容器
  5. 執行dockerfile中的下一條指令直到全部指令都執行完成

小總結

從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別表明軟件的三個不一樣階段,docker

  • Dockerfile是軟件的原材料apache

  • Docker鏡像是軟件的交付品vim

  • Docker容器則能夠認爲是軟件的運行態。centos

Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,協力充當Docker體系的基石。tomcat

  1. Dockerfile,須要定義一個Dockerfile,Dockerfile定義了進程須要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態連接庫、操做系統的發行版、服務進程和內核進程(當應用進程須要和系統服務和內核進程打交道,這時須要考慮如何設計namespace的權限控制)等等;
  2. Docker鏡像,在用Dockerfile定義一個文件以後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;
  3. Docker容器,容器是直接提供服務的。

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

命令 說明
FROM 基礎鏡像,當前新鏡像是基於哪一個鏡像的
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時須要運行的命令
EXPOSE 當前容器對外暴露出的端口
WORKDIR 指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
ENV 用來在構建鏡像過程當中設置環境變量;<br/>ENV MY_PATH /usr/mytest<br/>這個環境變量能夠在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴同樣;<br/>也能夠在其它指令中直接使用這些環境變量,<br/> <br/>好比:WORKDIR $MY_PATH
ADD 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY 相似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置;<br/>COPY src dest;<br/>COPY ["src", "dest"]
VOLUME 容器數據卷,用於數據保存和持久化工做
CMD 指定一個容器啓動時要運行的命令;<br/>Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換
ENTRYPOINT 指定一個容器啓動時要運行的命令;<br/>ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發

案例

Base鏡像(scratch)

Docker Hub 中 99% 的鏡像都是經過在 base 鏡像中安裝和配置須要的軟件構建出來的bash

自定義鏡像mycentos

編寫

自定義mycentos目的使咱們本身的鏡像具有以下:網絡

  • 登錄後的默認路徑
  • vim編輯器
  • 查看網絡配置ifconfig支持
FROM centos
MAINTAINER zzyy<zzyy167@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash 

構建

docker build -t 新鏡像名字:TAG .

會看到 docker build 命令最後有一個 .運維

. 表示當前目錄

docker build -f /mydocker/dockerfile2 -t mycentos:1.3 .

運行

docker run -it 新鏡像名字:TAG

能夠看到,咱們本身的新鏡像已經支持vim/ifconfig命令,擴展成功了。

列出鏡像的變動歷史

docker history 鏡像名

CMD/ENTRYPOINT 鏡像案例

都是指定一個容器啓動時要運行的命令,差異以下:

  • CMD:Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換
  • ENTRYPOINT:docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT,以後造成新的命令組合

自定義鏡像Tomcat9

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/local
WORKDIR $MYPATH 
#配置java與tomcat環境變量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV 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.out
相關文章
相關標籤/搜索