『現學現忘』Docker基礎 — 34、DockerFile檔案詳解

繁華似錦Fighting發表於2022-03-29

1、DockerFile檔案說明

(1)DockerFile檔案是什麼

Dockerfile是用來構建Docker映象的文字檔案,文字內容包含了一條條構建映象所需的指令、引數和說明。

即:Dockerfile僅僅是用來製作映象的原始碼檔案,也可以說成是一個指令碼檔案。

(2)如何檢視Docker Hub中映象的Dockerfile檔案

進入Docker Hub官網:https://hub.docker.com/

我們以CentOS映象為例。

image

點選進入映象,在Supported tags and respective Dockerfile links:支援的標籤和相應的Dockerfile連結。

如下:

image

點選對應的版本,就會跳轉到GitHub中存放CentOS的Dockerfile檔案網站,如下圖:

image

我們就能夠檢視映象對應的Dockerfile檔案內容了。

2、Dockerfile構建過程解析

(1)Docker容器構建三步驟

  • 手動編寫一個Dockerfile檔案,當然必須要符合file的規範。(編寫)
  • 有了Dockerfile檔案後,直接執行docker build命令,在本地獲得一個自定義的Docker映象。(構建)
  • 通過docker run命令啟動映象,獲得Docker容器。(執行)

(2)Dockerfile檔案的基本結構

Dockerfile 一般分為:基礎映象、映象元資訊(作者等資訊)、映象操作指令和容器啟動時執行指令。

我們以CentOS映象的Dockerfile檔案為例,如下:

# 1.基礎映象
FROM scratch

# 2.映象元資訊
MAINTAINER https://github.com/CentOS/sig-cloud-instance-images

# 3、映象操作指令和引數(重點)
ADD centos-6-docker.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="20181006"

# 4.容器啟動時執行指令
CMD ["/bin/bash"]

提示:

  • Dockerfile檔案中的註釋為#
  • FROM scratch:為所有映象的基礎映象。
  • LABEL指令用來給映象以鍵值對的形式新增一些後設資料(metadata)。其實就是一些標籤,可以在inspect命令中看到。
  • 很多官方映象都是基礎包,很多功能沒有,我們通常會自己搭建自己的映象!

(3)Dockerfile注意事項

  • 每條保留字指令都必須為大寫字母,且後面要跟隨至少一個引數,即不能為空。
  • 指令按照從上到下,順序執行。
  • 每條指令都會建立一個新的映象層,並對映象進行提交。

(4)Docker執行Dockerfile的大致流程

  1. Docker從基礎映象執行一個容器。
  2. 執行一條指令並對容器作出修改。
  3. 執行類似docker commit的操作,來提交一個新的鎮像層。
  4. Docker再基於剛提交的映象執行一個新容器。
  5. 執行Dockerfile中的下一條指令,依次迴圈上面步驟,直到所有指令都執行完成。

3、總結

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

  1. Dockerfile是軟體的原材料。
  2. Docker映象是軟體的交付品。
  3. Docker容器則可以認為是軟體的執行態。

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

image

說明:

  • Dockerfile:Dockerfile定義了程式需要的一切東西。Dockerfile涉及的內容包括執行程式碼或者是檔案、環境變數、依賴包、執行時環境、動態連結庫、作業系統的發行版、服務程式和核心程式(當應用程式需要和系統服務和核心程式打交道,這時需要考慮如何設計namespace的許可權控制)等等。
  • Docker映象:通過定義好的Dockerfile檔案,執行docker build命令,會生成一個Docker映象,當執行Docker映象時,會真正開始提供服務。
  • Docker容器:容器是直接提供服務。

4、DockerFile保留字指令

  • FROM:基礎映象,當前新映象是基於哪個映象的。
  • MAINTAINER:映象維護者的姓名和郵箱地址。
  • RUN:容器構建時需要執行的命令。
  • EXPOSE:當前容器對外暴露出的埠(埠對映)。
  • WORKDIR:指定在建立容器後,終端預設登陸進來的工作目錄,一個落腳點,也就是pwd的位置。
  • ENV:用來在構建映象過程中設定環境變數。
    ENV MY_PATH /usr/mytest
    
    # 這個環境變數可以在後續的任何RUN指令中使用,這就如同在命令前面,指定了環境變數字首一樣;也可以在其它指令中直接使用這些環境變數。
    # 比如使用如下方式在DockerFile中使用:
    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"...],在指定了 ENTRVPOINT指令後,用CMD指定具體的數。
    重點提示:Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD也會被docker run之後的引數替換。
  • ENTRYPOINT:指定一個容器啟動時要執行的命令。
    ENTRYPOINT的目的和CMD一樣,都是在指定容器啟動程式及引數,
    但是ENTRYPOINT不會被docker run之後的引數替換,會進行追加。
  • ONBUILD:當構建一個被繼承的Dockerfile時執行命令,父映象在被子繼承後,父映象的onbuild被觸發(觸發指令,類似一個觸發器)

DockerFile常用指令如下圖:

image

相關文章