天天看點

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

Dockerfile 是一個文本檔案,記錄了鏡像建構的所有步驟。

第一個 Dockerfile

用 Dockerfile 建立上節的 ubuntu-with-vi,其内容則為:

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

下面我們運作 docker build 指令建構鏡像并詳細分析每個細節。

root@ubuntu:~# pwd         ①  

/root  

root@ubuntu:~# ls          ②   

Dockerfile   

root@ubuntu:~# docker build -t ubuntu-with-vi-dockerfile .        ③   

Sending build context to Docker daemon 32.26 kB           ④   

Step 1 : FROM ubuntu           ⑤   

 ---> f753707788c5   

Step 2 : RUN apt-get update && apt-get install -y vim           ⑥   

 ---> Running in 9f4d4166f7e3             ⑦   

......   

Setting up vim (2:7.4.1689-3ubuntu1.1) ...   

 ---> 35ca89798937           ⑧    

Removing intermediate container 9f4d4166f7e3          ⑨   

Successfully built 35ca89798937           ⑩   

root@ubuntu:~#   

① 目前目錄為 /root。

② Dockerfile 準備就緒。

③ 運作 docker build 指令,<code>-t</code> 将新鏡像命名為 <code>ubuntu-with-vi-dockerfile</code>,指令末尾的 <code>.</code> 指明 build context 為目前目錄。Docker 預設會從 build context 中查找 Dockerfile 檔案,我們也可以通過 <code>-f</code> 參數指定 Dockerfile 的位置。

④ 從這步開始就是鏡像真正的建構過程。 首先 Docker 将 build context 中的所有檔案發送給 Docker daemon。build context 為鏡像建構提供所需要的檔案或目錄。

Dockerfile 中的 ADD、COPY 等指令可以将 build context 中的檔案添加到鏡像。此例中,build context 為目前目錄 <code>/root</code>,該目錄下的所有檔案和子目錄都會被發送給 Docker daemon。

是以,使用 build context 就得小心了,不要将多餘檔案放到 build context,特别不要把 <code>/</code>、<code>/usr</code> 作為 build context,否則建構過程會相當緩慢甚至失敗。

⑤ Step 1:執行 <code>FROM</code>,将 ubuntu 作為 base 鏡像。

ubuntu 鏡像 ID 為 f753707788c5。

⑥ Step 2:執行 <code>RUN</code>,安裝 vim,具體步驟為 ⑦、⑧、⑨。

⑦ 啟動 ID 為 9f4d4166f7e3 的臨時容器,在容器中通過 apt-get 安裝 vim。

⑧ 安裝成功後,将容器儲存為鏡像,其 ID 為 35ca89798937。

這一步底層使用的是類似 docker commit 的指令。

⑨ 删除臨時容器 9f4d4166f7e3。

⑩ 鏡像建構成功。

通過 docker images 檢視鏡像資訊。 

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

鏡像 ID 為 35ca89798937,與建構時的輸出一緻。

在上面的建構過程中,我們要特别注意指令 RUN 的執行過程 ⑦、⑧、⑨。Docker 會在啟動的臨時容器中執行操作,并通過 commit 儲存為新的鏡像。

檢視鏡像分層結構

ubuntu-with-vi-dockerfile 是通過在 base 鏡像的頂部添加一個新的鏡像層而得到的。

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

這個新鏡像層的内容由 <code>RUN apt-get update &amp;&amp; apt-get install -y vim</code> 生成。這一點我們可以通過 <code>docker history</code> 指令驗證。

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

<code>docker history</code> 會顯示鏡像的建構曆史,也就是 Dockerfile 的執行過程。

ubuntu-with-vi-dockerfile 與 ubuntu 鏡像相比,确實隻是多了頂部的一層 35ca89798937,由 apt-get 指令建立,大小為 97.07MB。docker history 也向我們展示了鏡像的分層結構,每一層由上至下排列。

注:

 表示無法擷取 IMAGE ID,通常從 Docker Hub 下載下傳的鏡像會有這個問題。

下一節我們學習鏡像的緩存特性。

Dockerfile 建構鏡像 - 每天5分鐘玩轉容器技術(13)

繼續閱讀