【Docker】以Overlay2存储驱动为例:分析Docker容器与镜像(底层只读镜像层+上层可读写容器层)在联合文件系统中的目录组织结构

19 篇文章 3 订阅

# Docker镜像与层

Docker 镜像作为Docker容器的基础,由一系列层堆叠组成,每个层代表镜像的Dockerfile中的一条指令。除了最上层可写的容器层外,每个层都是只读了,且每个层与之前的层只有一部分差异。当创建并启动一个新的容器时,Docker会加载只读镜像层并在其上(即镜像栈顶部)添加一个可读写层,这个层通常被称为“容器层”。如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层(Cow写时复制技术),该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)。下图显示了一个基于 Ubuntu 15.04 镜像的容器。

# Overlay存储驱动

Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层,而merged层是lower层和upper层的统一视图。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。结构如下图所示:

# Docker镜像层与容器层在Overlay2存储驱动下的目录组织

1、首先查看主机Docker使用的存储驱动:

zzw@zzw-C6100:/var/lib/docker$ docker info

2、接着创建并运行一个python容器,并进入容器终端:

root@zzw-C6100:/var/lib/docker/overlay2# docker run -it python /bin/bash

在容器内任意创建一个文件,我创建的 a.py,用于后续验证容器上层可写层位于哪个目录 。

接下来记录当前容器的ID号(即为/bash后root对应的用户账号),并按 ctrl+p ctrl+q,退出容器并使容器处于后台运行状态。

3、根据容器ID号查看其详细信息:

root@zzw-C6100:/var/lib/docker/overlay2# docker inspect be73c583387c

使用inspect命令查看刚刚创建的容器的详细信息,找到其对应的GraphDriver(即存储驱动)的详细信息如下所示:

 对应如下内容,如下:

  • LowerDir对应的是容器的只读镜像层;
  • UpperDir为容器的可读写层;
  • MergedDir为底层只读镜像层和上层可读写容器层的统一视图。
"GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/dc19f3a99bfa0d9e2a64b80efc1001ab770ccb7a4507f7ac4fb2cb20bfb30802-init/diff:/var/lib/docker/overlay2/ddf5a9e003cae592c1df801cf15366bf3031bd3f1140438347d40dccd3265e6d/diff:/var/lib/docker/overlay2/8d35bffc2f24a1500635c3118a137937b15a184d8ae36780639c9e6086dcc6a7/diff:/var/lib/docker/overlay2/872529c1cfbf8eece3b961f9ef87d19159d68ff0d32667605df90488c20e20b1/diff:/var/lib/docker/overlay2/8ee8a7a44204a2873056c88da162eed917410fce7d1778d0ca64a8a17af231d3/diff:/var/lib/docker/overlay2/3386cc55eeceb7d322bd1025f586c0a385b96bb289be321aa4c28b0e0694e481/diff:/var/lib/docker/overlay2/29832e99939c65aeb04b572a6720bdb5f92caaa1884d85757a9dbb37020e316f/diff:/var/lib/docker/overlay2/1534a048ec5bab5cbdfc542bb0d912016181b7a0d23781f8cb28dc33551adbae/diff:/var/lib/docker/overlay2/38597c54c2880d8b259727b08c981dc8be82c5d07d235d1557c9805bc31f619c/diff:/var/lib/docker/overlay2/13d3fa86f98d3c93ae68790e403562e08e419d3d8694a007c38b258b8c2d52cb/diff",
                "MergedDir": "/var/lib/docker/overlay2/dc19f3a99bfa0d9e2a64b80efc1001ab770ccb7a4507f7ac4fb2cb20bfb30802/merged",
                "UpperDir": "/var/lib/docker/overlay2/dc19f3a99bfa0d9e2a64b80efc1001ab770ccb7a4507f7ac4fb2cb20bfb30802/diff",
                "WorkDir": "/var/lib/docker/overlay2/dc19f3a99bfa0d9e2a64b80efc1001ab770ccb7a4507f7ac4fb2cb20bfb30802/work"
            },
            "Name": "overlay2"
        },

其中LowerDir基础镜像由又由多个镜像层(Dockerfile中每一条指令即为一个镜像层)所组成,如上 "LowerDir" 目录结构所示,每个只读层都是在前一层的基础上构建,都位于 /var/lib/docker/overlay2/ 目录下,并且对应一个唯一的ID目录。即只读镜像的每一层都对应 /var/lib/docker/overlay2/ 目录下唯一一个以ID号区分的目录,且上层是在下层的基础上构建。

"MergeDir"、"UpperDir"、"WorkDir" 均位于 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/ 目录下。即可读可写的容器层、提供统一视图的合并层均位于 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/ 目录下,它们三者的父目录 /var/lib/docker/overlay2/ 才与只读镜像层的目录同级。

4、检查对应目录的内容

首先查看 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/ 目录内容,紧接着查看其中的可读写容器层提供统一视图的合并层,如下所示。

会发现可读写层目录 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/diff 对应的即为容器可读写层视图(其中包括了在容器运行过程中创建的 a.py 文件),而合并层目录 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/merged 提供的即为整个容器统一视图。

5、停止容器,并继续查看可写层内容

docker stop命令停止容器,并进入 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/diff 目录查看会发现 a.py 文件任然存在,因为仅仅停止了容器,并没有remove杀死容器,所以其上层可读写层的内容任然保留:

 当使用docker rm删除容器后,即kill掉该容器,其可写层内容即丢失,如下所示:

 并且整个提供容器可写层与统一视图的 /var/lib/docker/overlay2/dc19f3a99bfa...cb20bfb30802/ 目录也会被删除,如下所示:

# 总结

至此,可以得出Overlay2存储驱动的目录结构组织方式:

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值