第四章 镜像原理

目录

一、联合文件系统

二、镜像加载原理

三、分层理解


一、联合文件系统

Docker 联合文件系统(Union File System, UFS)是一种分层文件系统,它允许Docker镜像拥有多层次结构,使得Docker可以充分利用相同层作为共享层,减少存储空间资源的占用。并且可以高效地使用磁盘空间。Docker 使用 aufsoverlay2btrfszfs 等联合文件系统驱动来支持镜像层的复用和高效存储,默认使用overlay2作为存储驱动。Docker 默认使用 overlay2 联合文件系统主要是基于以下原因:

1. overlay2 是在 Linux 内核中实现的,它允许 Docker 容器在不同的底层存储之间创建一个隔离的文件系统层。

2. overlay2 是为了解决性能和资源利用率问题而设计的,它通过重用底层的数据来优化存储。

3. overlay2 支持写时复制(copy-on-write),这意味着只有当文件系统发生变化时才会复制数据。

4. overlay2 是 Docker 在较新版本中推荐使用的存储驱动,它提供了较好的兼容性和性能。

如果你需要改变 Docker 的默认存储驱动,可以在启动 Docker 守护进程时使用 --storage-driver 选项。例如,如果你想要使用 overlay 驱动,你可以在 Docker 的服务文件中添加这样的启动参数:

bash 复制代码
# 在 Docker 服务的配置文件中添加
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --storage-driver=overlay

要查看当前Docker使用的联合文件系统类型,可以使用以下命令:

bash 复制代码
docker info | grep "Storage Driver"

如果你需要调整Docker使用的联合文件系统的配置,可以编辑Docker的守护进程配置文件 /etc/docker/daemon.json,如果该文件不存在,你可以创建它并重启Docker守护进程。例如,如果你想要配置 overlay2 驱动并设置一个最大大小为10GB的 read-only layer:

bash 复制代码
{

"storage-driver": "overlay2",

"storage-opts": [

"overlay2.override_kernel_check=true",

"overlay2.size=10GB"

]

}

重启Docker守护进程:

bash 复制代码
sudo systemctl restart docker

这样就可以对Docker的联合文件系统进行配置了,此外,不是所有的文件系统都可以在所有系统上作为存储驱动使用,你需要确保你选择的驱动与你的操作系统兼容。

二、镜像加载原理

Docker镜像加载的基本原理是分层和写时复制(Copy on Write)。

  1. 分层: Docker镜像是由多个层次构成的,每一层都只记录了上一层的改变。如下图,一个基础镜像可能是Debian,当你在Debian的基础上安装了一个emcos,这个改变会被记录在一个新的层次上。

  2. 写时复制: 当Docker启动一个容器的时候,它并不会立即复制所有的层次,而是会在需要修改时才进行复制。这意味着如果有多个容器运行同一个镜像,它们实际上会共享相同的层次(如下图的Debian和emacs),只有当一个容器尝试修改一个层次时,这个层次才会被复制并且修改。

三、分层理解

Docker分层是指Docker镜像是由多个只读层组成,这些层是通过联合文件系统(Union File System)叠加在一起的。每一层都代表了Dockerfile中的一个指令。所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前的镜像层之上,创建新的镜像层。如下图所示:

这种设计使得镜像的分发和复用更加高效,因为只有变化的部分会被复制和传输,而不是整个基础镜像。

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。

Docker镜像都是只读的 ,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层。

相关推荐
lsx2024061 分钟前
jEasyUI 合并单元格详解
开发语言
乌暮5 分钟前
JavaEE入门--计算机是怎么工作的
java·后端·java-ee
散峰而望5 分钟前
C++入门(算法) - 习题
开发语言·c++·算法·github
Z3r4y10 分钟前
【代码审计】RuoYi-4.2 五处安全问题分析
java·web安全·代码审计·若依4.2·ruoyi-4.2
在下胡三汉11 分钟前
创建轻量级 3D 资产 - Three.js 中的 GLTF 案例
开发语言·javascript·3d
代码栈上的思考12 分钟前
Spring MVC 中 @RequestMapping 路径映射与请求处理全流程
java·spring·mvc
xqlily18 分钟前
Prover9/Mace4 的形式化语言简介(二)
开发语言
WZTTMoon27 分钟前
Spring MVC 核心工作原理:DispatcherServlet 全流程深度解析
java·spring·mvc
金銀銅鐵37 分钟前
[Java] 用 Swing 生成一个最大公约数计算器(展示计算过程)
java·后端·数学
2501_9304122741 分钟前
如何添加清华源到Conda?
开发语言·python·conda