今天我們來談一談怎樣保存對一個容器的修改,生成自己的鏡像。
先來看一個例子,然後詳細分析一下每一步具體都做了什麼:
- docker run --name hw_container ubuntu:latest touch /helloworld
啓動一個容器,並創建一個 helloworld 目錄
- docker commit hw_container hw_image
將我們之前所作的修改,保存成一個鏡像
- docker rm -vf hw_container
刪除容器
- docker run --rm hw_image ls -l /helloworld
檢查更新是否生效
上圖描述了從容器到一個新鏡像的流程。
當執行docker commit命令一個新的層就會被寫入到鏡像,於此同時運行容器的環境變量、工作目錄、暴露的端口、掛載目錄、可執行的命令以及參數都會被寫入到新的鏡像中。我們來看一個例子:
- docker run --name rich-image-example -e ENV_EXAMPLE1=Rich -e ENV_EXAMPLE2=Example busytbox:latest
- docker commit rich-image-example rie
- docker run --rm rie /bin/sh -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”
將entrypoint 和 command 寫入到 鏡像
- docker run --name rich-image-example2 --entrypoint “/bin/sh” rie -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”
- docker commit rich-image-example2 rie
- docker run --rm rie
要理解一個鏡像的生成過程,我們需要深入的瞭解UFS (Union File System)。 請看下圖:
Docker commit 命令之後新的可寫成將變爲只讀層,這也是爲什麼每次commit 之後鏡像的size會變大的原因。
怎樣知道我們對容器進行了哪些修改?
docker diff container_name
A 表添加 C 表修改 D表刪除
怎樣查看鏡像有哪些層組成?
docker history image_name
這裏我們另外再介紹一種生成鏡像的方式, 我們可以把對容器的改動導出成一個tar文件,然後導入tar文件生成鏡像。命令如下:
- docker export
- docker import
具體如何使用,這裏不做詳細介紹