镜像的分层结构 - 每天5分钟玩转容器技术(11)

Docker 支持通过扩展现有镜像,创建新的镜像。

实际上,Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。比如我们现在构建一个新的镜像,Dockerfile 如下:

① 新镜像不再是从 scratch 开始,而是直接在 Debian base 镜像上构建。
② 安装 emacs 编辑器。
③ 安装 apache2。
④ 容器启动时运行 bash。

构建过程如下图所示:

可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

问什么 Docker 镜像要采用这种分层结构呢?

最大的一个好处就是 - 共享资源

比如:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享,我们将在后面更深入地讨论这个特性。

这时可能就有人会问了:如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?

答案是不会!
修改会被限制在单个容器内。
这就是我们接下来要学习的容器 Copy-on-Write 特性。

可写的容器层

当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。

只有容器层是可写的,容器层下面的所有镜像层都是只读的

下面我们深入讨论容器层的细节。

镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。

  1. 添加文件
    在容器中创建文件时,新文件被添加到容器层中。
  2. 读取文件 在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
  3. 修改文件 在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
  4. 删除文件 在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享

理解了镜像的原理和结构,下一节我们学习如何构建镜像。

时间: 2024-10-18 12:39:04

镜像的分层结构 - 每天5分钟玩转容器技术(11)的相关文章

每天5分钟玩转容器技术 整理目录

原 写在最前面 - 每天5分钟玩转容器技术(1) 容器生态系统 - 每天5分钟玩转容器技术(2) 容器生态系统 (续) - 每天5分钟玩转容器技术(3) 运行第一个容器 - 每天5分钟玩转容器技术(4) [视频]运行第一个容器 - 每天5分钟玩转容器技术(5) 容器 What, Why, How - 每天5分钟玩转容器技术(6) Docker 架构详解 - 每天5分钟玩转容器技术(7) Docker 组件如何协作?- 每天5分钟玩转容器技术(8) 最小的镜像 - 每天5分钟玩转容器技术(9) b

写在最前面 - 每天5分钟玩转容器技术(1)

<每天5分钟玩转容器技术>是一个有关容器技术的教程,有下面两个特点: 系统讲解当前最流行的容器技术.从容器的整个生态环境到各个具体的技术,从整体到细节逐一讨论. 重实践并兼顾理论.从实际操作的角度带领大家学习容器技术. 为什么要写这个? 简单回答是:容器技术非常热门,但门槛高. 容器技术是继大数据和云计算之后又一炙手可热的技术,而且未来相当一段时间内都会非常流行. 对 IT 行业来说,这是一项非常有价值的技术.而对 IT 从业者来说,掌握容器技术是市场的需要,也是提升自我价值的重要途径. 拿我

base 镜像 - 每天5分钟玩转容器技术(10)

上一节我们介绍了最小的 Docker 镜像本节讨论 base 镜像. base 镜像有两层含义 不依赖其他镜像从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像比如 Ubuntu, Debian, CentOS 等. 我们以 CentOS 为例考察 base 镜像包含哪些内容.下载镜像 docker pull centos 查看镜像信息 镜像大小不到 200MB. 等一下一个 CentOS 才 200MB

构建镜像 - 每天5分钟玩转容器技术(12)

对于 Docker 用户来说,最好的情况是不需要自己创建镜像.几乎所有常用的数据库.中间件.应用软件等都有现成的 Docker 官方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用. 使用现成镜像的好处除了省去自己做镜像的工作量外,更重要的是可以利用前人的经验.特别是使用那些官方镜像,因为 Docker 的工程师知道如何更好的在容器中运行软件. 当然,某些情况下我们也不得不自己构建镜像,比如: 找不到现成的镜像,比如自己开发的应用程序. 需要在镜像中加入特定的功能,比如官方镜像几乎

Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)

Dockerfile 是一个文本文件,记录了镜像构建的所有步骤. 第一个 Dockerfile 用 Dockerfile 创建上节的 ubuntu-with-vi,其内容则为: 下面我们运行 docker build 命令构建镜像并详细分析每个细节. [email protected]:~# pwd         ① /root [email protected]:~# ls          ② Dockerfile [email protected]:~# docker build -t

运行第一个容器 - 每天5分钟玩转容器技术(4)

为了让大家对容器有个感性认识,我们将尽快让一个容器运行起来. 首先我们需要搭建实验环境. 环境选择 容器需要管理工具.runtime 和操作系统,我们的选择如下: 管理工具 - Docker Engine因为 Docker 最流行使用最广泛. runtime - runcDocker 的默认 runtime 操作系统 - Ubuntu虽然存在诸如 CoreOS 的容器 OS,因考虑到我们目前处于初学阶段,选择大家熟悉的操作系统更为合适.等具备了扎实的容器基础知识后再使用容器 OS 会更有利. 安

Docker 架构详解 - 每天5分钟玩转容器技术(7)

Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 - Container Docker 架构如下图所示: Docker 采用的是 Client/Server 架构.客户端向服务器发送请求,服务器负责构建.运行和分发容器.客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信. Dock

Docker 组件如何协作?- 每天5分钟玩转容器技术(8)

还记得我们运行的第一个容器吗?现在通过它来体会一下 Docker 各个组件是如何协作的. 容器启动过程如下: Docker 客户端执行 docker run 命令. Docker daemon 发现本地没有 httpd 镜像. daemon 从 Docker Hub 下载镜像. 下载完成,镜像 httpd 被保存到本地. Docker daemon 启动容器. docker images 可以查看到 httpd 已经下载到本地. docker ps 或者 docker container ls 

容器 What, Why, How - 每天5分钟玩转容器技术(6)

学习任何东西都可以按照3W的框架进行,容器技术也是一样,先回答 What.Why 和 How 这三个问题. What - 什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行.开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机.物理服务器或公有云主机上运行. 容器与虚拟机 谈到容器,就不得不将它与虚拟机进行对比,因为两者都是为应用提供封装和隔离. 容器由两部分组成: 应用程序本身 依赖:比如应用程序需要的库或其他软