1. 程式人生 > >Docker映象構建的兩種方式

Docker映象構建的兩種方式

大家肯定安裝過ghost系統,映象就像是ghost檔案,容器就像是ghost系統。你可以拿別人的ghost檔案安裝系統(使用映象執行容器),也可以把自己現有的系統製作成ghost檔案(從容器構建映象)。Dockerfile則像是一個生成ghost檔案的指令碼(映象構建指令碼),這個指令碼會指定去哪裡下載哪個版本的window系統,再去哪裡下載哪些軟體並安裝,再修改哪些配置檔案,等等。本文主要講的是,如何從容器構建映象(把現有系統製作成ghost檔案),和如何使用Dockerfile構建映象(使用指令碼生成ghost檔案)。

兩種方式構建映象的主要步驟:

  1. 從容器構建映象(以下簡稱容器映象
    • 建立一個容器,比如使用tomcat:latest映象建立一個tomcat-test容器
    • 修改tomcat-test容器的檔案系統,比如修改tomcat的server.xml檔案中的預設埠
    • 使用commit命令提交映象
  2. 使用Dockerfile構建映象(以下簡稱Dockerfile映象
    • 編寫Dockerfile檔案
    • 使用build命令構建映象

兩種構建方式的區別:

  1. 容器映象的構建者可以任意修改容器的檔案系統後進行釋出,這種修改對於映象使用者來說是不透明的,映象構建者一般也不會將對容器檔案系統的每一步修改,記錄進文件中,供映象使用者參考。
  2. 容器映象不能(更準確地說是不建議)通過修改,生成新的容器映象
    從映象執行容器,實際上是在映象頂部上加了一層可寫層,所有對容器檔案系統的修改,都在這一層中進行,不影響已經存在的層。比如在容器中刪除一個1G的檔案,從使用者的角度看,容器中該檔案已經沒有了,但從檔案系統的角度看,檔案其實還在,只不過在頂層中標記該檔案已被刪除,當然這個標記為已刪除的檔案還會佔用映象空間。從容器構建映象,實際上是把容器的頂層固化到映象中。
    也就是說, 對容器映象
    進行修改後,生成新的容器映象,會多一層,而且映象的體積只會增大,不會減小。長此以往,映象將變得越來越臃腫。Docker提供的export和import命令可以一定程度上處理該問題,但也並不是沒有缺點。
  3. 容器映象依賴的父映象變化時,容器映象必須進行重新構建。如果沒有編寫自動化構建指令碼,而是手工構建的,那麼又要重新修改容器的檔案系統,再進行構建,這些重複勞動其實是沒有價值的。
  4. Dockerfile映象是完全透明的,所有用於構建映象的指令都可以通過Dockerfile看到。甚至你還可以遞迴找到本映象的任何父映象的構建指令。也就是說,你可以完全瞭解一個映象是如何從零開始,通過一條條指令構建出來的。
  5. Dockerfile映象
    需要修改時,可以通過修改Dockerfile中的指令,再重新構建生成,沒有任何問題。
  6. Dockerfile可以在GitHub等原始碼管理網站上進行託管,DockerHub自動關聯原始碼進行構建。當你的Dockerfile變動,或者依賴的父映象變動,都會觸發映象的自動構建,非常方便。

不管是官方還是我個人,都推薦使用第二種方式構建映象。

關於Dockerfile裡面指令的詳細說明,這裡就不一一列出了