一、Docker 镜像分层
Dockerfile
由多条指令构成,随着深入研究 Dockerfile
与镜像的关系,很快大家就会发现,Dockerfile
中的每一条指令都会对应于 Docker 镜像中的一层。
继续以如下 Dockerfile
为例:
FROM ubuntu:14.04 #指定新镜像所基于的镜像,用于创建镜像
ADD run.sh / #将脚本添加至该镜像中,启动容器后就可以使用了
VOLUME /data #在容器中创建挂载点(-v)
CMD ["./run.sh"] #启动该脚本/命令
通过 docker build
以上 Dockerfile
的时候,会在 ubuntu:14.04
镜像基础上,添加三层独立的镜像,依次对应于三条不同的命令。镜像示意图如下:

可以看出,镜像在生成的过程中是以分层的方式生成的:
- Dockerfile 中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)
- 镜像层将被缓存和复用(后续的镜像层将基于前面的一层)
- 当 Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(就会自动销毁)
- 某一层的镜像缓存失效之后,它之后的镜像层缓存就都会失效(第一层不成功,那么第二层也就再成功,相当于地基)
- 容器的修改并不会影响镜像,如果在某一层中添加一个文件,如果在下一层中就会删除它,镜像中依然会包含该文件
二、Docker 容器创建方法
1.基于已有镜像创建
本创建方法实质上就是将一个容器里面运行的程序以及该程序的运行环境打包起来生成新的镜像
命令格式:
docker commit [选项] 容器ID/名称 仓库名称:[标签]
常用选项:
-m:说明信息
-a:作者信息
-p:生成过程中停止容器的运行
例:
1.创建容器
[root@docker ~]# docke