011、镜像的分层结构(2018-12-28 周五)
Docker支持通过扩展现有镜像,创建新的镜像
实际上Docker Hub上99%的镜像都是在base镜像的基础上,安装和配置软件后构建出来的。
FROM debian # 镜像不在是从scratch开始,而是从debian base开始
RUN apt-get install emacs # 安装emacs
RUN apt-get install apache2 # 安装apache2
CMD ["/bin/bash"] # 容器启动时运行bash
构建过程如下图:
新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层
Docker为什么要分这么多层 -- 共享资源。
比如好多镜像都是从相同base的基础上构建出来来,那么 Docker Host上只需要保存一份base即可,同时内存中也只需加载一份base镜像,镜像的每一层都可以被分享,
Copy-on-Write
多个容器共享一个基础镜像,那么当某个容器修改了配置文件,其他容器会受影响吗? 不会
容器在启动时,会创建一个新的可写层,加载到镜像的顶部。这一层通常被称作容器层,容器层下面的是镜像层
对容器的所有改动,都只发生在容器层,下面的镜像层是只读的。
所有镜像层叠加起来组成一个统一的文件系统。如果不同层中有一个相同的文件,,比如 /a ,上层的 /a 会覆盖下层的 /a ,用户只能看到最靠近顶端镜像层中的/a
1、添加文件 -- 新文件会被添加到容器层中
2、读取文件 -- 在镜像层中从上往下找,找到后不再继续向下查找
3、修改文件 -- 在镜像层中从上往下找,找到后复制到容器层进行修改
4、删除文件 -- 在镜像层中从上往下找,找到后在容器层将该文件标记为删除
只有当需要修改时才从镜像层复制一份到容器层,这个特性叫做 Copy-on-Write 。容器层保存的是镜像变化的部分,并不会对镜像本身进行修改