Docker|了解容器镜像层(2)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker|了解容器镜像层(2)

引言

容器非常神奇。它们允许简单的进程表现得像虚拟机。在这种优雅的底层是一组模式和实践,最终使一切运作起来。在设计的根本是层。层是存储和分发容器化文件系统内容的基本方式。这种设计既出人意料地简单,同时又非常强大。在今天的帖子中,我将解释什么是层以及它们的概念性工作原理。

Snapshots

在容器可以运行之前,它需要一个文件系统来挂载。本质上,它需要一个目录,其中包含所有需要可用的文件。压缩的层文件包含文件系统的组成部分,但它们不能直接挂载和使用。相反,它们需要被解压并组织成一个文件系统。这个解压后的目录被称为快照(snapshots)。

创建快照的过程与构建镜像相反。它首先通过下载清单并构建一个要下载的层列表开始。对于每个层,会创建一个包含层父目录内容的目录。这个目录被称为活动快照。接下来,差异应用器负责解压压缩的层文件,并将更改应用到活动快照上。生成的目录随后被称为提交快照。最终的提交快照是作为容器文件系统挂载的那一个。

使用我们之前的例子:

  1. 初始层,FROM scratch,意味着我们可以从下一层和一个空目录开始。没有父层。
  2. 创建了一个 layer2 的目录。这个空目录现在是一个活动快照。文件 layer2.tar.gz 被下载、验证(通过比较摘要和文件名),并解压到目录中。结果是包含 /work/message.txt 的目录。这是第一个提交快照。
  3. 创建了一个 layer3 的目录,并将 layer2 的内容复制进去。这是一个新的活动快照。文件 layer3.tar.gz 被下载、验证并解压。结果是包含 /work/message.txt 和 /work/content.txt 的目录。现在这是第二个提交快照。
  4. 创建了一个 layer4 的目录,并将 layer3 的内容复制进去。文件 layer4.tar.gz 被下载、验证并解压。差异应用器识别到 whiteout 文件,/work/.wh.message.txt,并删除 /work/message.txt。这只剩下 /work/content.txt。这是第三个提交快照。
  5. 由于 layer4 是最后一层,它是容器的基础。为了使其能够支持读写操作,创建了一个新的快照目录,并将 layer4 的内容复制进去。这个目录被挂载为容器的文件系统。运行中的容器所做的任何更改都将发生在这个目录中。

如果这些目录中的任何一个已经存在,这表明另一个镜像有相同的依赖关系。因此,引擎可以跳过下载和差异应用器。它可以直接使用该层。在实践中,这些目录和文件的命名都是基于内容的摘要,以便于识别。例如,一组快照可能看起来像这样:

/var/path/to/snapshots/blobs
└─ sha256
   ├─ 635944d2044d0a54d01385271ebe96ec18b26791eb8b85790974da36a452cc5c
   ├─ 9de59f6b211510bd59d745a5e49d7aa0db263deedc822005ed388f8d55227fc1
   ├─ fb0624e7b7cb9c912f952dd30833fb2fe1109ffdbcc80d995781f47bd1b4017f
   └─ fb124ec4f943662ecf7aac45a43b096d316f1a6833548ec802226c7b406154e9

实际的快照系统支持插件,这些插件可以改善一些这些行为。例如,它允许快照预先组合和解压,加快了这一过程。这允许快照被存储在远程位置。它还允许进行特殊优化,比如按需下载所需的文件和层。

Overlays

虽然挂载起来很容易,但我们刚刚描述的快照方法会产生大量的文件变动和许多重复文件。这会减慢第一次启动容器的过程,并浪费空间。幸运的是,这是容器化过程中可以由文件系统处理的众多方面之一。Linux 原生支持将目录作为覆盖层挂载,为我们实现了大部分过程。

在 Linux 中(或者以 --privileged 或 --cap-add=SYS_ADMIN 运行的 Linux 容器中):

  1. 创建 tmpfs 挂载(基于内存的文件系统,将用于探索覆盖过程)
mkdir /tmp/overlay
mount -t tmpfs tmpfs /tmp/overlay
  1. 为我们的流程创建目录。我们将使用 lower 作为下(父)层,使用 upper 作为上(子)层,作为文件系统的工作目录,并合并以包含合并的文件系统。
mkdir /tmp/overlay/{
   
   lower,upper,work,merged}
  1. 为实验创建一些文件。或者,您也可以在 upper 中添加文件。
cd /tmp/overlay
echo hello > lower/hello.txt
echo "I'm only here for a moment" > lower/delete-me.txt
echo message > upper/upper-message.txt
  1. 将这些目录安装为覆盖类型文件系统。这将在合并目录中创建一个新的文件系统,其中包含下层目录和上层目录的组合内容。工作目录将用于跟踪文件系统的更改。
mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
  1. 探索文件系统。您会注意到 merged 包含 upper 和 lower 的组合内容。然后,进行一些更改:
rm -rf merged/delete-me.txt
echo "I'm new" > merged/new.txt
echo world >> merged/hello.txt
  1. 正如预期的那样,delete-me.txt 将从合并中删除,并在同一目录中创建一个新文件 new.txt。如果你对目录进行树化,你会看到一些有趣的东西:
|-- lower
|   |-- delete-me.txt
|   `-- hello.txt
|-- merged
|   |-- hello.txt
|   |-- new.txt
|   `-- upper-message.txt
|-- upper
|   |-- delete-me.txt
|   |-- hello.txt
|   |-- new.txt
|   `-- upper-message.txt

运行 ls -l upper 显示

total 12
c--------- 2 root root 0, 0 Jan 20 00:17 delete-me.txt
-rw-r--r-- 1 root root   12 Jan 20 00:20 hello.txt
-rw-r--r-- 1 root root    8 Jan 20 00:17 new.txt
-rw-r--r-- 1 root root    8 Jan 20 00:17 upper-message.txt

虽然合并显示了我们更改的效果,上层(作为父层)存储更改的方式与我们手册过程中的例子类似。它包含了新文件 new.txt 和修改过的 hello.txt。它还创建了一个 whiteout 文件。对于覆盖文件系统来说,这涉及到用一个字符设备(和一个 0, 0 设备号)替换文件。简而言之,它拥有我们打包目录所需的一切!

你可以看到这种方法也可以用来实现快照系统。挂载命令可以原生地接受一个冒号 (:) 分隔的 lowerdir 路径列表,所有这些路径都被合并到一个单一的文件系统中。这是现代容器的本质——容器是使用操作系统的原生特性组合而成的。

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
Kubernetes极速入门
Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 本课程从Kubernetes的简介、功能、架构,集群的概念、工具及部署等各个方面进行了详细的讲解及展示,通过对本课程的学习,可以对Kubernetes有一个较为全面的认识,并初步掌握Kubernetes相关的安装部署及使用技巧。本课程由黑马程序员提供。   相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
14天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
151 77
|
23天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
1天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
14 4
|
16天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
59 3
|
23天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
56 7
|
23天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
30 5
|
23天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
53 4
|
23天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
52 3
|
23天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
28 2
|
23天前
|
存储 安全 数据中心
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具
Docker 容器凭借轻量级和高效的特性,成为应用部署的重要工具。本文探讨了 Docker 如何通过 Namespace 和 Cgroups 实现 CPU、内存、网络和存储资源的隔离,提高系统安全性和资源利用率,以及面临的挑战和应对策略。
41 1