關于Docker里面的幾個主要概念
這里用個不太恰當?shù)谋确絹碚f明。
大家肯定安裝過ghost系統(tǒng),鏡像就像是ghost文件,容器就像是ghost系統(tǒng)。你可以拿別人的ghost文件安裝系統(tǒng)(使用鏡像運行容器),也可以把自己現(xiàn)有的系統(tǒng)制作成ghost文件(從容器構建鏡像)。Dockerfile則像是一個生成ghost文件的腳本(鏡像構建腳本),這個腳本會指定去哪里下載哪個版本的window系統(tǒng),再去哪里下載哪些軟件并安裝,再修改哪些配置文件,等等。本文主要講的是,如何從容器構建鏡像(把現(xiàn)有系統(tǒng)制作成ghost文件),和如何使用Dockerfile構建鏡像(使用腳本生成ghost文件)。
兩種方式構建鏡像的主要步驟:
從容器構建鏡像(以下簡稱容器鏡像)
創(chuàng)建一個容器,比如使用tomcat:latest鏡像創(chuàng)建一個tomcat-test容器
修改tomcat-test容器的文件系統(tǒng),比如修改tomcat的server.xml文件中的默認端口
使用commit命令提交鏡像
使用Dockerfile構建鏡像(以下簡稱Dockerfile鏡像)
編寫Dockerfile文件
使用build命令構建鏡像
兩種構建方式的區(qū)別:
容器鏡像的構建者可以任意修改容器的文件系統(tǒng)后進行發(fā)布,這種修改對于鏡像使用者來說是不透明的,鏡像構建者一般也不會將對容器文件系統(tǒng)的每一步修改,記錄進文檔中,供鏡像使用者參考。
容器鏡像不能(更準確地說是不建議)通過修改,生成新的容器鏡像。
從鏡像運行容器,實際上是在鏡像頂部上加了一層可寫層,所有對容器文件系統(tǒng)的修改,都在這一層中進行,不影響已經(jīng)存在的層。比如在容器中刪除一個1G的文件,從用戶的角度看,容器中該文件已經(jīng)沒有了,但從文件系統(tǒng)的角度看,文件其實還在,只不過在頂層中標記該文件已被刪除,當然這個標記為已刪除的文件還會占用鏡像空間。從容器構建鏡像,實際上是把容器的頂層固化到鏡像中。
也就是說, 對容器鏡像進行修改后,生成新的容器鏡像,會多一層,而且鏡像的體積只會增大,不會減小。長此以往,鏡像將變得越來越臃腫。Docker提供的export和import命令可以一定程度上處理該問題,但也并不是沒有缺點。容器鏡像依賴的父鏡像變化時,容器鏡像必須進行重新構建。如果沒有編寫自動化構建腳本,而是手工構建的,那么