第四章 镜像原理

目录

一、联合文件系统

二、镜像加载原理

三、分层理解


一、联合文件系统

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

相关推荐
J老熊18 分钟前
SpringBoot 源码解读与自动装配原理结合Actuator讲解
java·spring boot·后端·spring·面试·系统架构
六点半88821 分钟前
【C++】“list”的介绍和常用接口的模拟实现
开发语言·数据结构·c++·算法·青少年编程·list
鸽芷咕1 小时前
【Python报错已解决】 Encountered error while trying to install package.> lxml
开发语言·python·bug
九离十1 小时前
初识C语言(五)
c语言·开发语言
java_heartLake1 小时前
设计模式之备忘录模式
java·设计模式·备忘录模式
坊钰1 小时前
【Java SE 题库】移除元素(暴力解法)--力扣
java·开发语言·学习·算法·leetcode
pumpkin845142 小时前
profile-spec-ref元素
java·jvm
南瓜战士2 小时前
【经验分享】MyCAT 中间件
java·spring boot
阿华的代码王国2 小时前
【JavaEE】——线程池大总结
java·开发语言·jvm·java-ee