今天我们来谈一谈怎样保存对一个容器的修改,生成自己的镜像。
先来看一个例子,然后详细分析一下每一步具体都做了什么:
- docker run --name hw_container ubuntu:latest touch /helloworld
启动一个容器,并创建一个 helloworld 目录
- docker commit hw_container hw_image
将我们之前所作的修改,保存成一个镜像
- docker rm -vf hw_container
删除容器
- docker run --rm hw_image ls -l /helloworld
检查更新是否生效
上图描述了从容器到一个新镜像的流程。
当执行docker commit命令一个新的层就会被写入到镜像,于此同时运行容器的环境变量、工作目录、暴露的端口、挂载目录、可执行的命令以及参数都会被写入到新的镜像中。我们来看一个例子:
- docker run --name rich-image-example -e ENV_EXAMPLE1=Rich -e ENV_EXAMPLE2=Example busytbox:latest
- docker commit rich-image-example rie
- docker run --rm rie /bin/sh -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”
将entrypoint 和 command 写入到 镜像
- docker run --name rich-image-example2 --entrypoint “/bin/sh” rie -c “echo \$ENV_EXAMPLE1 \$ENV_EXAMPLE2”
- docker commit rich-image-example2 rie
- docker run --rm rie
要理解一个镜像的生成过程,我们需要深入的了解UFS (Union File System)。 请看下图:
Docker commit 命令之后新的可写成将变为只读层,这也是为什么每次commit 之后镜像的size会变大的原因。
怎样知道我们对容器进行了哪些修改?
docker diff container_name
A 表添加 C 表修改 D表删除
怎样查看镜像有哪些层组成?
docker history image_name
这里我们另外再介绍一种生成镜像的方式, 我们可以把对容器的改动导出成一个tar文件,然后导入tar文件生成镜像。命令如下:
- docker export
- docker import
具体如何使用,这里不做详细介绍