在说docker的文件系统之前,我们需要先想清楚一个问题。我们知道docker的启动是依赖于image,docker在启动之前,需要先拉取image,然后启动。多个容器可以使用同一个image启动。那么问题来了:这些个容器是共用一个image,还是各自将这个image复制了一份,然后各自独立运行呢?
我们假设每个容器都复制了一份这个image,然后各自独立运行,那么就意味着,启动多少个容器,就需要复制多少个image,毫无疑问这是对空间的一种巨大浪费。事实上,在容器的设计当中,通过同一个Image启动的容器,全部都共享这个image,而并不复制。那么问题又随之而来:既然所有的容器都共用这一个image,那么岂不是我在任意一个容器中所做的修改,在其他容器中都可见?如果我一个容器要将一个配置文件修改成A,而另一个容器同样要将这个文件修改成B,两个容器岂不是会产生冲突?
pull镜像示例如下:
上面的示例是从docker官方镜像仓库拉取一个nginx:latest镜像,可以看到在拉取镜像时,是一层一层的拉取的。事实上镜像也是这么一层一层的存储在磁盘上的。通常一个应用镜像包含多层,如下所示:
我们首先需要明确一点,镜像是只读的。每一层都只读。在上图上,我们可以看到,在内核之上,最底层首先是一个基础镜像层,这里是一个debian的基础镜像,因为镜像的只读特性,如果我们想要在这个debian的基础镜像上安装一个emacs编辑器,则只能在基础镜像之上,在构建一层新的镜像层。同样的道理,如果想要在当前的emacs基础镜像层之上添加一个apache,则只能在其上再构建一个新的镜像层。而这即是镜像的分层特性。
通过docker history centos:6.9可看到每一层的数据变化
[root@localhost ~]#docker history httpd:latest