005_镜像分层

来源:互联网 发布:医疗软件注册证 编辑:程序博客网 时间:2024/06/06 00:27

镜像分层

Docker支持通过扩展现有镜像,创建新的镜像;实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件创建出来的;

下面用一个实例来说明:
Dockerfile 如下: (注:执行命令把交互都考虑进去,否则容器会创建失败,如下面的 yum -y install
From centos
run yum -y install acpid
run yum -y install httpd
cmd ["/bin/bash"]

从上边的 Dockerfile 可以看出,新镜像是从 base 镜像 之上叠加生成的,每执行一个 yum 就在现有的基础上增加一层;

采用分层结构的最大好处就是共享资源
eg: 有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需要在磁盘上保存一份 base 镜像;同时内存中也只需要加载一份 base 镜像,就可以为所有的容器服务了,而且镜像的每一层都可以被共享;

多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,其他容器的相同文件是不会被修改的,修改会被限制在单个容器内(这里看不懂没关系,请继续往下看);


可写的容器层

当容器启动时,一个新的 可写层 会被加载到镜像的顶部,这一层叫做 “容器层” ; 容器层 之下的都叫 “镜像层”;如下图所示:



所有对容器的修改,都只会发生在容器层中;只有容器层是可写的,容器层下的所有的镜像都是只读的;


深入讨论容器层的细节

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /test,上层的 /test 会覆盖下层的 /test,也就是说用户只能访问到上层中的文件 /test。在容器层中,用户看到的是一个叠加之后的文件系统。

1.添加文件
在容器中创建文件时,新文件被添加到容器层中。
2.读取文件
在容器中读取某个文件时,Docker 会 从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层, 然后打开并读入内存。
3.修改文件
在容器中修改已存在的文件时,Docker 会 从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
4.删除文件
在容器中删除文件时,Docker 也是 从上往下 依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。所以容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享



原创粉丝点击