目錄
1、DockerFile檔案說明
(1)DockerFile檔案是什麼
Dockerfile是用來構建Docker映象的文字檔案,文字內容包含了一條條構建映象所需的指令、引數和說明。
即:Dockerfile僅僅是用來製作映象的原始碼檔案,也可以說成是一個指令碼檔案。
(2)如何檢視Docker Hub中映象的Dockerfile檔案
進入Docker Hub官網:https://hub.docker.com/
我們以CentOS映象為例。
點選進入映象,在Supported tags and respective Dockerfile links
:支援的標籤和相應的Dockerfile連結。
如下:
點選對應的版本,就會跳轉到GitHub中存放CentOS的Dockerfile檔案網站,如下圖:
我們就能夠檢視映象對應的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的大致流程
- Docker從基礎映象執行一個容器。
- 執行一條指令並對容器作出修改。
- 執行類似
docker commit
的操作,來提交一個新的鎮像層。 - Docker再基於剛提交的映象執行一個新容器。
- 執行Dockerfile中的下一條指令,依次迴圈上面步驟,直到所有指令都執行完成。
3、總結
從應用軟體的角度來看,Dockerfile、Docker映象與Docker容器分別代表軟體的三個不同階段,
- Dockerfile是軟體的原材料。
- Docker映象是軟體的交付品。
- Docker容器則可以認為是軟體的執行態。
Dockerfile面向開發,Docker映象成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。
說明:
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常用指令如下圖: