Docker 用镜像方式迁移和用Dockerfile动态生成有什么区别?


初学Docker,有几个疑问:
  1. 用dockerfile build出来的容器,和用save/load镜像run出来的容器会一样吗?
  2. Dockerfile里面包含的一些脚本行为(比如启动一些后台服务等),在静态的镜像里是怎样的一种情况?换句话说,我把这个镜像迁移后,是否会保存这些脚本行为?
已邀请:

vikings - 热衷研究技术的非专业Dev

赞同来自: 田浩浩


1.用dockerfile build出来的容器,和用save/load镜像run出来的容器会一样吗?

分情况:
情况一:假定这个image build之后没有run过,那么通过save只是将这个image所有的data layer导成二进制tar文件。通过load导入后,和之前build好的image相比没有区别,所以一样。
情况二:假定这个image 已经被run过但未commit(如果commit,则会是一个新的image),那么通过save仍然只是将image的data layer导成二进制tar文件,而container所产生的新data layer不会导出。因此通过load导入后,和正在处于run状态的container相比,数据不一致(缺少run之后产生的data layer)。

2.Dockerfile里面包含的一些脚本行为(比如启动一些后台服务等),在静态的镜像里是怎样的一种情况?换句话说,我把这个镜像迁移后,是否会保存这些脚本行为?

假定你设定的脚本行为是通过dockerfile的cmd设定的,那么:
在Dockerfile中设定的脚本行为,是保存在graph目录的data layer中的。这些相当于image运行时的metadata。
如果出现迁移,那么需要区分是如何进行迁移的。如果单纯的使用save/load,那么新的image仍然会执行。
如果是将container进行commit生成新image的方式进行迁移,那么old image设定的脚本将失效。

田浩浩 - wizmacau developer

赞同来自:

  1. 可以参考这里,大概意思是 save/load的镜像会稍大一点,因为save会保存之前对镜像操作的历史信息以及一些元数据,您可以通过docker images --tree命令来查询load之后的镜像信息树。
    至于它们run出来的container我认为应该是一样的吧(未测)。


PS:如果想要镜像的尺寸缩减,推荐使用export/import。
  1. 脚本会被添加到构建后的镜像里的。

要回复问题请先登录注册