Docker 之 打包

今天我們來談一談怎樣保存對一個容器的修改,生成自己的鏡像。
先來看一個例子,然後詳細分析一下每一步具體都做了什麼:

  1. docker run --name hw_container ubuntu:latest touch /helloworld

啓動一個容器,並創建一個 helloworld 目錄

  1. docker commit hw_container hw_image

將我們之前所作的修改,保存成一個鏡像

  1. docker rm -vf hw_container

刪除容器

  1. docker run --rm hw_image ls -l /helloworld

檢查更新是否生效

在這裏插入圖片描述
上圖描述了從容器到一個新鏡像的流程。

當執行docker commit命令一個新的層就會被寫入到鏡像,於此同時運行容器的環境變量、工作目錄、暴露的端口、掛載目錄、可執行的命令以及參數都會被寫入到新的鏡像中。我們來看一個例子:

  1. docker run --name rich-image-example -e ENV_EXAMPLE1=Rich -e ENV_EXAMPLE2=Example busytbox:latest
  2. docker commit rich-image-example rie
  3. docker run --rm rie /bin/sh -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”

將entrypoint 和 command 寫入到 鏡像
  1. docker run --name rich-image-example2 --entrypoint “/bin/sh” rie -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”
  2. docker commit rich-image-example2 rie
  3. 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文件生成鏡像。命令如下:

  1. docker export
  2. docker import

具體如何使用,這裏不做詳細介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章