Docker中为我们提供了将容器中这个可读可写的环境持久化为一个镜像程的方法,即docker comit。dcoker commit 将容器修改的内容保存为镜像,我们可以把它理解为提交容器的更改。

1.生成变更后的镜像

以nginx为例:

docket 通过容器 创建镜像 docker基于已有容器创建镜像_现有容器


使用docker commit提交变更

docker commit -m 'my nginx 1.0'  c198e4ee8d8c

-m 参数进行提交的注释,用法类似 git。

docket 通过容器 创建镜像 docker基于已有容器创建镜像_现有容器_02

2.为镜像命名

在上面的例子里,我们发现提交容器更新后产生的镜像并没有 REPOSITORY 和 TAG 的内容,也就是说,这个新的镜像还没有名字。 Docker 为我们提供了一个为镜像取名的命令,也就是 docker tag 命令。

docker tag 15ee397d0139 mynginx:1.0

使用 docker tag也能够对已有的镜像创建一个新的别名副本(旧的镜像与名称也会保留)。

docker tag mynginx:1.0 mynginx:2.0

当然,我们可以在提交变更的时候同时命名镜像

docker commit -m 'mynginx:2.0' nginx mynginx:2.0
3.迁移镜像

在我们将更新导出为镜像后,我们还可以开始迁移镜像。
由于 Docker 是以集中的方式管理镜像的,所以在迁移之前,我们要先从 Docker 中取出镜像。docker save 命令可以将镜像输出,提供了一种让我们保存镜像到 Docker 外部的方式。

# 将mynginx:1.0镜像,导出到mynginx-1.0.tar
docker save -o ./mynginx-1.0.tar mynginx:1.0

-o 选项,用来指定输出文件

在镜像导出之后,我们就可以找到已经存储镜像内容的 mynginx-1.0.tar 这个文件了。如果使用解压软件查看其中的内容,会看到里面其实就是镜像所基于的几个镜像层的记录文件。

docket 通过容器 创建镜像 docker基于已有容器创建镜像_镜像_03


我们可以通过很多种方式将导出的镜像文件复制到另一台机器上,在这么操作之后,我们就要将镜像导入到这台新机器中运行的 Docker 中。

导入镜像用 docker load 命令即可。

Tips: 我们并不真的需要一台新的机器,把当前环境中 Docker something 镜像删掉即可
docker rmi mynginx:1.0

docker load -i mynginx-1.0.tar

镜像导入后,我们就可以通过 docker images 看到它了,导入的镜像会延用原有的镜像名称。