要知道, 当我们运行一个容器的时候 (如果不使用卷的话), 我们做的任何文件修改都会被记录与容器存储层里. 而 Docker 提供了一个 docker commit 的命令, 可以将容器的存储层保存下来成为镜像. 换句话说, 就是在原有镜像的基础上, 在叠加上容器的存储层, 并构成信的镜像, 以后我们运行这个新镜像的时候, 就会拥有原有容器最后的文件变化.
docker commit 的语法格式为:
docker commit[选项] < 容器 ID 或容器名 > [< 仓库名 >[:< 标签 >]]
但是, 慎用 docker commit
使用 docker commit 命令虽然可以比较直观的帮助理解镜像分层存储的概念, 但是实际环境中并不会这样使用.
首先, 如果在安装软件, 编译构建, 那会有大量的无关内容被添加进来, 如果不小心清理, 将会导致镜像及其臃肿.
此外, 使用 docker commit 意味着所有对镜像的操作都是黑箱操作, 生成的镜像也被称为黑箱镜像, 换句话说, 就是除了制定镜像的人知道执行过什么命令, 怎么生成的镜像, 别人根本无从得知, 而且, 即使是这个制作镜像的人, 过一段时间后也无法记清具体的操作的. 虽然 docker diff 或许可以得到一点线索, 但是远远不到可以确保生成一致镜像的地步. 这种黑箱镜像的维护工作是非常痛苦的.
而且, 任何修改的结果仅仅是在当前层进行标记, 添加, 修改, 而不会改动上一层. 如果使用 docker commit 制作镜像, 以及后期修改的话, 每一次修改都会让镜像更加臃肿一次, 所删除的上一层的东西并不会丢失, 会一直如影随形的跟着这个镜像, 即使根本无法访问到, 这会使镜像更加臃肿.
docker commit 有一些特殊的应用场合, 比如被入侵后保存现场等. 但是, 不要使用 docker commmit 定制镜像, 定制行为应该使用 Dockerfile 来完成.
本文转载自:
来源: http://www.bubuko.com/infodetail-3252705.html