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