基于已有容器构建自己的 Docker 镜像
Docker 中为我们提供了将容器中的这个可读可写的环境持久化为一个镜像层的方法,即docker commit
。 docker commit
将容器修改的内容保存为镜像,我们可以把它理解为提交容器的更改。
1.生成变更后的镜像
我们以上一节的 busyBox 为例:
# 重新创建一个busyBox容器
docker run --name busyBox -d -i busyBox
# 进入容器
docker exec -it busyBox sh
# 做些更改,新建个文件
echo 'something' > something
# 查看变更后的目录和文件
ls
[root@centos8 ~]# docker commit -m 'something' busyBox
sha256:19da0182bca9305944f6a66b1331ff7394a915bc8982cf520660a883484699fc
-m
参数进行提交的注释,用法类似 git。
执行 docker commit
将容器记录成镜像层的时候,会先暂停容器的运行,以保证容器内的文件系统处于一个相对稳定的状态,确保数据的一致性。提交镜像更新后,docker images
从本地镜像列表中找到它。
2. 为镜像命名
在上面的例子里,我们发现提交容器更新后产生的镜像并没有 REPOSITORY 和 TAG 的内容,也就是说,这个新的镜像还没有名字。 Docker 为我们提供了一个为镜像取名的命令,也就是 docker tag
命令。
docker tag 19da0182bca9 mybusyBox:1.0
当然,我们可以在提交变更的时候同时命名镜像
3. 迁移镜像
在我们将更新导出为镜像后,我们还可以开始迁移镜像。
由于 Docker 是以集中的方式管理镜像的,所以在迁移之前,我们要先从 Docker 中取出镜像。docker save
命令可以将镜像输出,提供了一种让我们保存镜像到 Docker 外部的方式。
# 将 something:latest镜像,导出到something-latest.tar
docker save -o ./something-latest.tar something:latest
-o
选项,用来指定输出文件
在镜像导出之后,我们就可以找到已经存储镜像内容的 something-latest.tar 这个文件了。如果使用解压软件查看其中的内容,会看到里面其实就是镜像所基于的几个镜像层的记录文件。
导入镜像用 docker load
命令即可。
Tips: 我们并不真的需要一台新的机器,把当前环境中 Docker something 镜像删掉即可
docker image rm something:latest
docker load -i something-latest.tar
镜像导入后,我们就可以通过 docker images
看到它了,导入的镜像会延用原有的镜像名称。
4. 从容器直接导出到镜像压缩包
使用 docker export
命令我们可以直接导出容器,我们可以把它理解为 docker commit
与 docker save
的结合体。
下面我们从容器 busyBox 中直接导出镜像包:
docker export -o ./something-export.tar busyBox
需要注意的是,这种方式导出的镜像压缩包不能使用docker load
的方式导入,而应该使用 docker import
。使用 docker import
并非直接将容器导入,而是将容器运行时的内容以镜像的形式导入。所以导入的结果其实是一个镜像,而不是容器。在 docker import
的参数里,我们需要给这个镜像命名。
docker import ./something-export.tar something:export