要知道,當我們運行一個容器的時候(如果不使用卷的話),我們做的任何文件修改都會被記錄與容器存儲層里。而Docker提供了一個docker commit 的命令,可以將容器的存儲層保存下來成為鏡像。換句話說,就是在原有鏡像的基礎上,在疊加上容器的存儲層,並構成信的鏡像,以后我們運行這個新鏡像的時候,就會擁有原有容器最后的文件變化。
docker commit的語法格式為:
docker commit[選項] <容器ID或容器名> [<倉庫名>[:<標簽>]]
但是,慎用docker commit
使用docker commit命令雖然可以比較直觀的幫助理解鏡像分層存儲的概念,但是實際環境中並不會這樣使用。
首先,如果在安裝軟件,編譯構建,那會有大量的無關內容被添加進來,如果不小心清理,將會導致鏡像及其臃腫。
此外,使用docker commit 意味着所有對鏡像的操作都是黑箱操作,生成的鏡像也被稱為黑箱鏡像,換句話說,就是除了制定鏡像的人知道執行過什么命令,怎么生成的鏡像,別人根本無從得知,而且,即使是這個制作鏡像的人,過一段時間后也無法記清具體的操作的。雖然docker diff或許可以得到一點線索,但是遠遠不到可以確保生成一致鏡像的地步。這種黑箱鏡像的維護工作是非常痛苦的。
而且,任何修改的結果僅僅是在當前層進行標記,添加,修改,而不會改動上一層。如果使用docker commit制作鏡像,以及后期修改的話,每一次修改都會讓鏡像更加臃腫一次,所刪除的上一層的東西並不會丟失,會一直如影隨形的跟着這個鏡像,即使根本無法訪問到,這會使鏡像更加臃腫。
docker commit有一些特殊的應用場合,比如被入侵后保存現場等。但是,不要使用docker commmit定制鏡像,定制行為應該使用Dockerfile來完成。
