docker學習:dockefile解析
阿新 • • 發佈:2021-12-14
是什麼
- DockerFile 是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼
- 構建三部曲
- 編寫Dockerfile檔案
- docker build
- docker run
- 檔案什麼樣???
DockerFile構建過程解析
- Dockerfile內容基礎知識
- 每條保留字指令都必須為大寫字母且後面要跟隨至少一個引數
- 指令按照從上到下,順序執行
-
表示註釋
- 每條指令都會建立一個新的映象層,並對映象進行提交
- docker執行Dockerfile的大致流程
- docker從基礎映象執行一個容器
- 執行一條指令並對容器做出修改
- 執行類似 docker commit的操作提交一個新的映象層
- docker再基於剛提交的映象執行一個新的容器
- 執行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
- 編寫
- Hub預設CentOS映象什麼情況
- 準備編寫Dockerfile檔案
- myCentOS內容DockerFile
- 構建
- docker build -t 新映象名字:TAG .
- 執行
- docker run -it -name mycentos mycentos:1.3 /bin/bash
- 列出映象的更變歷史
- docker history 映象ID
CMD/ENTRYPOINT 映象案例
- 都是指定一個容器執行時要執行的命令
- CMD
- Dockerfile 中可以有多個CMD命令,但是隻有最後一個生效,CMD會被docker run之後的引數替換
- Case
- tomcat的講解演示
- ENTRYPOINT
- docker run 之後的引數會被當做引數傳遞給ENTRYPOINT,之後形成新的命令組合