還記得上一篇文章我們講了鏡像構建的三種方法,讓我們再回顧一下:
鏡像的構建有三種方法:
1. 基于運行的容器狀態(tài)生成新的鏡像,即docker commit;
2. 基于Dockerfile構建鏡像,即docker build;
3. 利用Docker Hub自動構建鏡像。
我們已經介紹了使用docker commit構建鏡像,那這篇文章讓我們講講如何使用Dockerfile構建鏡像
什么是Dockerfile?
dockerfile,相當于是一個文檔,客戶可以基于dockerfile生成新的容器
dockerfile僅僅是用來制作鏡像的源碼文件,是構建容器過程中的指令,docker能夠讀取dockerfile的指定進行自動構建容器,基于dockerfile制作鏡像,每一個指令都會創(chuàng)建一個鏡像層,即鏡像都是多層疊加而成,因此,層越多,效率越低,創(chuàng)建鏡像,層越少越好。因此能在一個指令完成的動作盡量通過一個指令定義。
Dockerfile鏡像制作的工作邏輯
首先需要有一個制作鏡像的目錄,該目錄下有個文件,名稱必須為Dockerfile,Dockerfile有指定的格式,#號開頭為注釋,,指定默認用大寫字母來表示,以區(qū)分指令和參數,docker build讀取Dockerfile是按順序依次Dockerfile里的配置,且第一條非注釋指令必須是FROM 開頭,表示基于哪個基礎鏡像來構建新鏡像??梢愿鶕汛嬖诘娜我忡R像來制作新鏡像。
Dockerfile可以使用環(huán)境變量,用ENV來定義環(huán)境變量,變量名支持bash的變量替換,如${variable:-word},表示如果變量值存在,就使用原來的變量,變量為空時,就使用word的值作為變量的值,一般使用這個表示法。
Dockerfile文件說明
在這里,我只列出了一些最常用的指令。
FROM:指定基礎鏡像,必須為第一個命令
MAINTAINER: 維護者信息
RUN:構建鏡像時執(zhí)行的命令
ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget
COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源
CMD:構建容器后調用,也就是在容器啟動時才進行調用。
ENTRYPOINT:配置容器,使其可執(zhí)行化。配合CMD可省去"application",只使用參數。
LABEL:用于為鏡像添加元數據
ENV:設置環(huán)境變量
EXPOSE:指定于外界交互的端口
VOLUME:用于指定持久化目錄
WORKDIR:工作目錄,類似于cd命令
USER:指定運行容器時的用戶名或 UID,后續(xù)的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創(chuàng)建所需要的用戶
ARG:用于指定傳遞給構建運行時的變量
ONBUILD:用于設置鏡像觸發(fā)器
......
用一張有趣的圖來解釋常用命令的意義:)
做個小示例
步驟 1 在/root目錄下創(chuàng)建一個dockerfile文件夾
mkdir dockerfile
步驟 2 創(chuàng)建一個名為dockerfile1的dockerfile文件。
cd ~/dockerfile
touch dockerfile1
步驟 3 使用vi編輯器編輯dockerfile1,做個最簡單的讓大家感受一下
vi dockerfile1
步驟 4 構建鏡像,鏡像命名為httpd:v11
docker build -t httpd:v11 -f dockerfile1 /root/dockerfile
步驟 5 查看創(chuàng)建的鏡像。
docker images
步驟 6 以鏡像httpd:v11運行一個容器。
docker run -d -p 8081:80 httpd:v11
步驟 7 驗證容器內容。
好了,使用dockerfile制作鏡像的方法,我們就講到這里了,更多內容大家可以繼續(xù)關注。