關於Docker裏面的幾個主要概念
這裏用個不太恰當的比方來講明。docker
你們確定安裝過ghost系統,鏡像就像是ghost文件,容器就像是ghost系統。你能夠拿別人的ghost文件安裝系統(使用鏡像運行容器),也能夠把本身現有的系統製做成ghost文件(從容器構建鏡像)。Dockerfile則像是一個生成ghost文件的腳本(鏡像構建腳本),這個腳本會指定去哪裏下載哪一個版本的window系統,再去哪裏下載哪些軟件並安裝,再修改哪些配置文件,等等。本文主要講的是,如何從容器構建鏡像(把現有系統製做成ghost文件),和如何使用Dockerfile構建鏡像(使用腳本生成ghost文件)。tomcat
兩種方式構建鏡像的主要步驟:
- 從容器構建鏡像(如下簡稱容器鏡像)
- 建立一個容器,好比使用
tomcat:latest
鏡像建立一個tomcat-test容器
- 修改tomcat-test容器的文件系統,好比修改tomcat的server.xml文件中的默認端口
- 使用commit命令提交鏡像
- 使用Dockerfile構建鏡像(如下簡稱Dockerfile鏡像)
- 編寫Dockerfile文件
- 使用build命令構建鏡像
兩種構建方式的區別:
- 容器鏡像的構建者能夠任意修改容器的文件系統後進行發佈,這種修改對於鏡像使用者來講是不透明的,鏡像構建者通常也不會將對容器文件系統的每一步修改,記錄進文檔中,供鏡像使用者參考。
- 容器鏡像不能(更準確地說是不建議)經過修改,生成新的容器鏡像。
從鏡像運行容器,其實是在鏡像頂部上加了一層可寫層,全部對容器文件系統的修改,都在這一層中進行,不影響已經存在的層。好比在容器中刪除一個1G的文件,從用戶的角度看,容器中該文件已經沒有了,但從文件系統的角度看,文件其實還在,只不過在頂層中標記該文件已被刪除,固然這個標記爲已刪除的文件還會佔用鏡像空間。從容器構建鏡像,其實是把容器的頂層固化到鏡像中。
也就是說, 對容器鏡像進行修改後,生成新的容器鏡像,會多一層,並且鏡像的體積只會增大,不會減少。久而久之,鏡像將變得愈來愈臃腫。Docker提供的 export
和 import
命令能夠必定程度上處理該問題,但也並非沒有缺點。
- 容器鏡像依賴的父鏡像變化時,容器鏡像必須進行從新構建。若是沒有編寫自動化構建腳本,而是手工構建的,那麼又要從新修改容器的文件系統,再進行構建,這些重複勞動實際上是沒有價值的。
- Dockerfile鏡像是徹底透明的,全部用於構建鏡像的指令均可以經過Dockerfile看到。甚至你還能夠遞歸找到本鏡像的任何父鏡像的構建指令。也就是說,你能夠徹底瞭解一個鏡像是如何從零開始,經過一條條指令構建出來的。
- Dockerfile鏡像須要修改時,能夠經過修改Dockerfile中的指令,再從新構建生成,沒有任何問題。
- Dockerfile能夠在GitHub等源碼管理網站上進行託管,DockerHub自動關聯源碼進行構建。當你的Dockerfile變更,或者依賴的父鏡像變更,都會觸發鏡像的自動構建,很是方便。
** 無論是官方仍是我我的,都推薦使用第二種方式構建鏡像。**網站
關於Dockerfile裏面指令的詳細說明,這裏就不一一列出了,你們能夠參考官方文檔,或關注我以後的文章,固然網上也是一搜一大堆。ui