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 指示该层不需要删除或修改前一层的任何文件。这允许压缩层文件与其他步骤并行创建。

相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
NoSQL 关系型数据库 Redis
Docker的通俗理解和通过宿主机端口访问Redis容器的实例
本文目标:引导初学者入门Docker,理解镜像、容器和宿主机概念,学习常用Docker命令,特别是如何创建并从Redis容器通过宿主机端口访问。 关键点: - Docker核心:镜像(类)、容器(实例)、宿主机(运行环境)。 - `docker pull` 拉取镜像,如 `redis:3.0`。 - `docker run -d --name` 后台运行容器,如 `my-redis`。 - `-p` 参数做端口映射,如 `6379:6379`。 - `docker exec -it` 交互式进入容器,如 `bash` 或执行命令。
|
1天前
|
Cloud Native 安全 Docker
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
云上攻防-云原生篇&Docker安全&系统内核&版本&CDK自动利用&容器逃逸
|
2天前
|
Linux Docker 容器
蓝易云 - net.ipv4.ip_forward=0导致docker容器无法与外部通信
完成以上步骤后,Docker容器应该能够正常与外部通信了。
8 2
|
2天前
|
Docker 容器
蓝易云 - Docker中容器的随机命名方式
例如,一个自动生成的容器名称可能是"happy_einstein"。这种随机命名方式既保证了容器名称的唯一性,又增加了一些趣味性。
7 2
|
1天前
|
前端开发 安全 数据库
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
Web架构&前后端分离站&Docker容器站&集成软件站&建站分配
|
4天前
|
监控 Java 数据安全/隐私保护
性能监控之 JMX 监控 Docker 容器中的 Java 应用
【6月更文挑战9天】性能监控之 JMX 监控 Docker 容器中的 Java 应用
24 1
|
8天前
|
运维 Ubuntu Docker
深入理解容器化技术:Docker的应用与实践
在这个数字化转型迅速推进的时代,容器化技术为软件开发和部署提供了新的路径。本文将深入探讨Docker技术的基本原理、应用场景以及实际操作,旨在帮助读者全面理解并掌握这一关键技术。
61 2
|
9天前
|
Docker 容器
蓝易云 - Docker修改容器ulimit的全部方案及各方案的详细步骤
以上就是修改Docker容器ulimit的全部方案及其详细步骤。
17 2
|
10天前
|
运维 Kubernetes 持续交付
Docker与Kubernetes:容器化技术的黄金搭档
【6月更文挑战第10天】Docker和Kubernetes是容器化技术的黄金组合,Docker提供轻量级、可移植的容器引擎,简化应用部署,而Kubernetes作为容器编排系统,实现自动化部署、扩展和管理,确保高可用性和可扩展性。两者的协作使得容器化应用更高效、可靠,共同推动软件开发和运维的创新。
|
9天前
|
存储 Linux Docker
Docker|了解容器镜像层(2)
Docker|了解容器镜像层(2)
23 0
Docker|了解容器镜像层(2)