目錄
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常用指令如下圖: