写点什么

容器最佳实践系列 - 查看 docker 的文件系统

用户头像
混沌畅想
关注
发布于: 2 小时前

实践目标:

  查看 docker 的文件系统,深入理解 Docker 文件系统

目标分析:

  我们在 centos 系统下选择使用 OverlayFS 实现的联合文件系统来进行上机实际操作,通过运行基于 nginx:alpine 镜像的 nginx 容器服务,查看 docker 文件系统的组成,并完成 4 个小测试来深入的理解 Docker 文件系统的分层与合并。

实践操作:

  第一步,配置 UnionFS 驱动类型

  • 关闭 docker 服务


>systemctl stop docker
复制代码


  • 配置 docker 文件

  编辑/etc/docker/daemon.json 文件,指定 storage-driver 为 overlay2,并且配置存储目录为/data/docker/overlay2。完整 daemon.json 配置如下。


{
“storage-driver”: “overlay2”,
“graph”: “/data/docker/overlay2”
}
复制代码
  • 开启 docker 服务


>systemctl start docker
复制代码


  • 确认当前存储驱动类型

  Docker 服务正常启动后,可以通过 docker info 命令确认当前 docker 环境的存储驱动类型,如图 1 所示。

图1-overlay2驱动

  第二步,查看镜像目录结构

  • 获取 nginx:alpine 镜像

  通过 docker pull nginx:alpine 命令拉取镜像,当镜像获取成功后,我们从图 2 中可以清楚的看到当前获取的 nginx 镜像一共有 2 个层,并且在配置的 overlay2 目录下也有对应的 2 个文件目录。

图2-拉取nginx镜像
  • 镜像目录结构及层次

  每一个镜像层或者容器层都是配置的存储目录/data/docker/overlay2 下 overlay2 目录的一个子目录,而每个镜像层和容器层的内容都是存储在其 diff 子目录中。

图3-镜像层目录

  在图 3(标识 1)中,nginx:alpine 镜像 2 个层的文件和一个 l(L 字母小写)文件夹,l 目录包中包含的是各层具体内容的短链接标识。例如短链接标识“4PGIP57PLO42QF7LF6CUERJ5BM”就是指向的以“a688f36”开头的层文件夹下的 diff 子目录,如图 3(标识 4)所示。

  从图 3(标识 2)所示的目录结构中,我们可以看出“a688f36”开头所代表的层是处在最底层,最底层的文件目录中包含有名为 link 的文件,如图 3(标识 5)所示,link 文件中的内容就是短链接标识符,而该短链接标识符指向的是该父级目录下的 diff 子目录;在图 3(标识 3)中,“d8b1de4”开头所代表的层则是底二层,同样该层目录下 link 文件也是指向的本层目录的 diff 子目录,但有一个不同时,通过该层目录下包含有 lower 文件,如图 3(标识 6)所示,lower 文件中的内容指向了该层的底层镜像文件,也就是 l(L 字母小写)目录下的特定短链接标识,而这个短链接标识“4PGIP57PLO42QF7LF6CUERJ5BM”正是指向 nginx:alpine 的最底层镜像。

  查看图 3(标识 2)和(标识 3),我们很容易发现最底层镜像 diff 子目录中包含更多的内容,这层是基础镜像层,包含了典型的目录结构,而第二层镜像 diff 子目录中包含的内容较少,这层则是安装 nginx 之后增加的可执行文件及其配置文件。

  第三步,查看容器目录结构

  • 运行容器

   基于 nginx:alpine 镜像的容器成功运行后,如图 4(标识 2)所示,在配置的 overlay2 目录下对应生成了 2 个文件目录。其中图 4(标识 4)所示以 init 结尾的文件目录处于下层,而图 4(标识 3)中的另一个文件目录作为 init 文件目录的上一层。这从图 4(标识 6)和(标识 7)中可以看到,init 结尾的层目录对应的 lower 文件指向该层依赖的前几个短链接标识,按图 4(标识 5)的链接对应关系,这 2 个短链接标识分别为最底层目录和第 2 层目录;同时不以 init 结尾的层目录对应的 lower 文件中短链接标识指向了最底层目录、第 2 层目录和 init 层。

图4-容器目录

  第四步,测试

  • 测试一,读取一个镜像层文件

  如图 5(标识 1)所示,执行 docker exe -it nginx sh 命令后,进入到名为 nginx 的容器内部,通过 cat 命令我们访问了 nginx 默认的/etc/nginx/conf.d/default.conf 配置文件,如图 5(标识 2)所示。退出容器后,我们分别访问了各层文件目录中的对应文件,参见图 5(标识 3)、(标识 4)、(标识 5)和(标识 6),只有在镜像层图 5(标识 4)所代表的镜像层第 2 层文件目录中发现了同样的 default.conf 配置文件,测试的结果与之前介绍的 nginx:alpine 镜像层第 2 层为 nginx 应用的相关配置相符。

图5-读取镜像层文件
  • 测试二,读取一个容器层文件

  如图 6(标识 1)所示,执行 docker exe -it nginx sh 命令后,在容器内部通过 cat 命令访问了/run/nginx.pid 文件。退出容器后,我们分别访问了各层文件目录中的对应文件,参见图 6(标识 2)、(标识 3)、(标识 4)和(标识 5),只有在容器层图 6(标识 5)所示的文件目录中发现了同样的 nginx.pid 文件。

图6-读取容器层文件
  • 测试三,新增一个文件

  如图 7(标识 1)所示,执行 docker exe -it nginx sh 命令后,在容器内部通过 touch 命令生成一个/etc/nginx/conf.d/test.conf 文件。退出容器后,我们分别访问了各层文件目录中的对应文件,参见图 3-14(标识 2)、(标识 3)、(标识 4)和(标识 5),只有在容器层图 7(标识 5)所示的文件目录中发现了同样的 test.conf 文件。

图7-新增文件
  • 测试四,删除一个文件

  如图 8(标识 1)所示,执行 docker exe -it nginx sh 命令后,在容器内部通过 rm 命令删除了 nginx 应用默认的/etc/nginx/conf.d/default.conf 文件。退出容器后,我们分别访问了各层文件目录中的对应文件,参见图 8(标识 2)、(标识 3)、(标识 4)和(标识 5),只有在容器层图 8(标识 5)所示的文件目录中发现了同样的 default.conf 文件。由于删除文件是将容器层中对应文件设置成 c 类型,即通过设置为字符设备类型来隐藏已经删除的文件。

图8-删除文件

实践总结:

  通过上机查看 nginx:alpine 镜像及其容器的各层文件目录,并结合 4 个小测试的实际操作,了解了联合文件系统是如何通过 overlay2 驱动完成分层及合并的统一,使读者可以更清晰的了解和掌握 Docker 的文件系统。

发布于: 2 小时前阅读数: 9
用户头像

混沌畅想

关注

还未添加个人签名 2017.10.22 加入

资深开发运维工程师。在数据库、高并发、异步编程、容器技术、微服务、图像识别等领域有着丰富的一线编程开发、运维实战和架构经验。

评论

发布
暂无评论
容器最佳实践系列-查看docker的文件系统