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

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

引言

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

构建分层镜像

创建映像时,通常使用 Dockerfile 来定义容器的内容。它包含一系列命令,例如:

FROM scratch
RUN echo "hello" > /work/message.txt
COPY content.txt /work/content.txt
RUN rm -rf /work/message.txt

在底层,容器引擎将按顺序执行这些命令,为每个命令创建一个“层”。但真正发生了什么?最简单的想法是将每个层视为一个目录,其中包含所有修改过的文件。

让我们通过一个可能的实现方法来逐步了解。

  1. FROM scratch 表示此容器从无内容开始。这是第一层,它可以用一个空目录表示,例如 /img/layer1。
  2. 创建第二个目录,/img/layer2,并将 /img/layer1 中的所有内容复制到其中。然后,执行 Dockerfile 中的下一个命令(该命令将文件写入 /work/message.txt)。这些内容被写入到 /img/layer2/work/message.txt。这是第二层。
  3. 创建第三个目录,/img/layer3,将 img/layer2 中的所有内容复制到其中。下一个 Dockerfile 命令要求将 content.txt 从主机复制到该目录。该文件被写入到 /img/layer3/work/content.txt。这是第三层。
  4. 最后,创建第四个目录,/img/layer4,将 img/layer3 中的所有内容复制到其中。下一个命令删除了消息文件,img/layer4/work/message.txt。这是第四层。

要共享这些层,最简单的方法是为每个目录创建一个压缩的 .tar.gz 文件。为了减少总文件大小,任何未修改的来自前一层的数据的文件将被删除。为了清楚地标记文件何时被删除,可以使用“whiteout file”作为占位符。文件只是将 .wh. 作为前缀添加到原始文件名。例如,第四层将用名为 .wh.message.txt 的占位符替换已删除的文件。当层被解压时,任何以 .wh. 开头的文件都可以被删除。

继续我们的例子,压缩文件将包含:

以这种方式构建大量镜像将导致产生许多“layer1”目录。为确保名称唯一性,压缩文件的命名基于内容的摘要。这与 Git 的工作方式类似。它的好处在于,可以在下载文件时识别相同的内容,并识别文件的任何损坏。如果内容的摘要与文件名不匹配,则文件已损坏。

为了使结果可复现,还需要一个额外的文件——一个解释如何排序层的文件(清单)。清单将识别哪些文件需要下载以及解压它们的顺序。这使得可以重新创建目录结构。它还提供了一个重要的好处:层可以在镜像之间重用和共享。这最小化了本地存储需求。

在实践中,还有更多的优化可用。例如,FROM scratch 的真正含义是没有父层,因此我们的例子实际上是从 layer2 的内容开始的。引擎还可以查看构建中使用的文件,以确定是否需要重新创建层。这是层缓存的基础,它最小化了构建或重新创建层的需求。作为额外的优化,不依赖前一层的层可以使用 COPY --link 指示该层不需要删除或修改前一层的任何文件。这允许压缩层文件与其他步骤并行创建。

相关实践学习
通过容器镜像仓库与容器服务快速部署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