即學(xué)即用Docker(六):基于Dockerfile構(gòu)建鏡像
2019-09-03閱讀 2718


還記得上一篇文章我們講了鏡像構(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ā)器

......

用一張有趣的圖來解釋常用命令的意義:)

 21.png

 

做個小示例

                  步驟 1    在/root目錄下創(chuàng)建一個dockerfile文件夾

           mkdir dockerfile

 

                  步驟 2    創(chuàng)建一個名為dockerfile1的dockerfile文件。

           cd ~/dockerfile

           touch dockerfile1

 

                  步驟 3    使用vi編輯器編輯dockerfile1,做個最簡單的讓大家感受一下

            vi dockerfile1

            22.jpg

                  步驟 4    構(gòu)建鏡像,鏡像命名為httpd:v11

             docker build -t httpd:v11 -f dockerfile1 /root/dockerfile

             23.jpg

                  步驟 5    查看創(chuàng)建的鏡像。

            docker images

             15.jpg

 

                  步驟 6    以鏡像httpd:v11運(yùn)行一個容器。

            docker run -d -p 8081:80 httpd:v11

 

                  步驟 7    驗證容器內(nèi)容。

           25.jpg

 好了,使用dockerfile制作鏡像的方法,我們就講到這里了,更多內(nèi)容大家可以繼續(xù)關(guān)注。