一、问题

对容器内部进行修改以后,如果想对这些修改进行保存。不想在退出容器,一不小心删掉容器丢失这些更改。并且你还希望将这些修改作为其它容器的基础进行使用,那么这个时候就需要打包成image了

二、解决方案

通过docker commit命令提交你对容器做出的修改并创建一个新的镜像image。
我们可以通过交互式bash shell的方式启动容器。更新软件包,如下所示。

  1. $ apt update
  2. $ apt install vim

当我们退出容器以后,容器会停止运行,但容器还在,知道你通过docker rm命令彻底删除容器。所以在删除之前可以对容器做得修改进行提交,并创建一个新的镜像ubuntu:update_vim。镜像的名称为ubuntu,同时增加了一个标签update以和原来的ubuntu:lastest 镜像加以区分。

  1. $ docker commit a922eb37 ubuntu:update_vim
  2. $ docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. ubuntu update_vim 2719f7931237 6 seconds ago 168MB

现在就可以安全的删除已经停止的容器了,同时也可以基于刚刚建立的容器ubuntu:update_vim 镜像启动新的容器

三、讨论

我们可以通过docker diff 命令来查看在容器中对镜像做出的修改,如下所示。

  1. $ docker diff a922eb3714d2
  2. A /usr/share/file
  3. A /usr/share/file/magic
  4. A /usr/share/file/magic.mgc
  5. C /usr/share/lintian
  6. C /usr/share/lintian/overrides
  7. A /usr/share/lintian/overrides/libcanberra0
  8. A /usr/share/lintian/overrides/readline-common
  9. A /usr/share/lintian/overrides/libpython3.8-stdlib
  10. A /usr/share/lintian/overrides/libpython3.8
  11. A /usr/share/lintian/overrides/libpython3.8-minimal
  12. A /usr/share/lintian/overrides/libvorbis0a
  13. A /usr/share/lintian/overrides/vim
  14. A /usr/share/lintian/overrides/vim-common
  15. C /usr/bin
  • A 表示文件或者文件夹是新增的
  • C表示文件内容有修改
  • D表示该项目已经删除