『現學現忘』Docker基礎 — 34、DockerFile文件詳解


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM