Docker镜像层和容器层的一些理解

133 阅读3分钟

容器层

假设我现在有一个容器test,里面运行的镜像是nginx:latest\

执行以下命令后,在打印结果里找到GraphDriver:Data可以看到以下结果
sh docker inspect test #这里除了用容器名也可以使用容器ID \

LowerDir

  • LowerDir: 这表示容器镜像的底层目录,通常是一系列以冒号分隔的目录,它们代表了容器镜像的不同层。每一层可能包含文件系统的不同部分,它们共同构成了容器的基础文件系统。在这个例子中,LowerDir 列出了多个层,这些层按照它们在镜像中的顺序堆叠。

MergedDir

  • MergedDir: 这是容器的合并目录,也称为联合挂载点。这个目录是 LowerDir 中所有层的合并视图,加上 UpperDir 中的任何更改。当你进入容器并查看其文件系统时,实际上看到的是这个合并后的目录。在这个例子中,MergedDir 是 /var/lib/docker/overlay2/3dc82d6e04f538300e08c2a555dfe5e3d58aeea506551f2d300fddb447ee2909/merged

UpperDir

  • UpperDir: 这个目录包含了容器对文件系统的所有写操作。当容器运行并修改其文件系统时,所有的更改都会在这个目录中体现。这个目录是可写的,而 LowerDir 中的层是只读的。在这个例子中,UpperDir 是 /var/lib/docker/overlay2/3dc82d6e04f538300e08c2a555dfe5e3d58aeea506551f2d300fddb447ee2909/diff

WorkDir

  • WorkDir: 工作目录是 overlayfs 存储驱动程序用来存放一些内部数据的地方,比如用于实现写时复制(copy-on-write)机制的元数据。通常,用户不需要直接与这个目录交互。在这个例子中,WorkDir 是 /var/lib/docker/overlay2/3dc82d6e04f538300e08c2a555dfe5e3d58aeea506551f2d300fddb447ee2909/work

Name

  • Name: 这表示正在使用的存储驱动程序的名称。在这个例子中,使用的存储驱动是 overlay2

重点看LowerDir部分(这就是容器的层,共计8层):

image.png


镜像层

开始构建: 假设我们有一个简单的 Dockerfile,如下所示:

Dockerfile1

FROM ubuntu:latest

开始构建: 假设我们有一个简单的 Dockerfile,如下所示:

Dockerfile2

FROM ubuntu:latest
RUN apt-get update && apt-get install
  • 上述的Dockerfile1构建成一个镜像层,sha256:123456...
  • Dockerfile2构建成另一个镜像层,sha256:abcdef...
  • 实际上构建镜像层sha256:abcded...时会复用镜像层sha256:123456...,除非这时候DockerHub上的ubuntu:latest已经发生了更新,这种情况下不复用,而是会重新拉取新的基础镜像