1. 程式人生 > 其它 >docker學習:dockefile解析

docker學習:dockefile解析

是什麼

  • DockerFile 是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼

  • 構建三部曲
    1. 編寫Dockerfile檔案
    2. docker build
    3. docker run

  • 檔案什麼樣???

DockerFile構建過程解析

  • Dockerfile內容基礎知識
    1. 每條保留字指令都必須為大寫字母且後面要跟隨至少一個引數
    2. 指令按照從上到下,順序執行
    3. 表示註釋

    4. 每條指令都會建立一個新的映象層,並對映象進行提交

  • docker執行Dockerfile的大致流程
    1. docker從基礎映象執行一個容器
    2. 執行一條指令並對容器做出修改
    3. 執行類似 docker commit的操作提交一個新的映象層
    4. docker再基於剛提交的映象執行一個新的容器
    5. 執行dockerfile中的下一條指令直到所有指令都執行完成

總結

從應用軟體的角度來看,dockerfile\Docker映象與Docker容器分別代表軟體的三個不同階段

  • Dockerfile 是軟體的原材料
  • Docker映象是軟體的交付品
  • Docker容器則可以認為是軟體的執行態
    Dockerfile面向開發,Docker映象成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石

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

FROM

基礎映象,當前映象是基於呢個映象呢


MAINTAINER

映象維護者的名字和郵箱


RUN

容器構建時需要執行的命令


EXPOSE

當前容器對外暴漏的埠號


WORKDIR

指定在建立容器後,終端預設登陸的進來工作目錄,一個落腳點


ENV

用來在構建映象過程中設定環境變數

  • ENV MY_PATH /usr/mytest
    這個環境變數可以在後續的任何RUN指令中使用,這就如同在命令面前指定了環境變數字首一樣;也可以在其他指令中直接使用這些環境變數

比如:WORKDIR $MY_PATH


ADD

將宿主機目錄下的檔案拷貝進映象且ADD命令會自動處理URL和解壓tar壓縮包


COPY

類似ADD,拷貝檔案和目錄到映象中。
將從構建上下文目錄中<源路徑>的檔案/目錄複製到新的一層的映象內的<目標路徑>位置

  • COPY src dest
  • COPY ['src','dest']

VOLUME

容器資料卷,用於資料儲存和持久化工作


CMD

指定一個容器啟動時要執行的命令

  • CMD指令的格式和RUN像是,也是兩種格式:
    • shell 格式:CMD<命令>
    • exec 格式:CMD ['可執行檔案','引數1','引數2'.。。]
    • 引數列表格式:CMD ['引數1','引數2'...] ENTRYPOINT 指令後,用CMD指定具體的引數
      dockerfile 中可以有多個cmd指令,但只有最後一個生效,cmd會被docker run 之後的引數替換

ENTRYPOINT

  • 指定一個容器啟動時要執行的命令
  • ENTRYPROINT的目的和CMD一樣,都是在指定容器啟動程式及引數

ONBUILD

當構建一個被繼承的Dockerfile時執行命令,父映象在被子繼承後赴京向的onbuild被觸發


總結

案例

Base映象(scratch)

Docker Hub 中99%的映象都是通過在base映象中安裝和配置需要的原件構建出來的


自定義映象mycentos

  1. 編寫
    • Hub預設CentOS映象什麼情況
    • 準備編寫Dockerfile檔案
    • myCentOS內容DockerFile
  2. 構建
    • docker build -t 新映象名字:TAG .
  3. 執行
    • docker run -it -name mycentos mycentos:1.3 /bin/bash
  4. 列出映象的更變歷史
    • docker history 映象ID

CMD/ENTRYPOINT 映象案例

  • 都是指定一個容器執行時要執行的命令
  • CMD
    • Dockerfile 中可以有多個CMD命令,但是隻有最後一個生效,CMD會被docker run之後的引數替換
    • Case
      • tomcat的講解演示
  • ENTRYPOINT
    • docker run 之後的引數會被當做引數傳遞給ENTRYPOINT,之後形成新的命令組合