第四章 镜像原理

目录

一、联合文件系统

二、镜像加载原理

三、分层理解


一、联合文件系统

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

相关推荐
Refrain_zc34 分钟前
Android 音视频通话核心 —— 音频编码(AAC)完整解析
java
xiaoshuaishuai844 分钟前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#
Xin_ye100861 小时前
C# 零基础到精通教程 - 第十八章:部署与发布——让应用上线
开发语言·c#
我是唐青枫1 小时前
Java JdbcTemplate 实战指南:用 Spring 轻量完成数据库增删改查
java·数据库·spring
思麟呀1 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
Lumbrologist2 小时前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
码不停蹄的玄黓2 小时前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的2 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪2 小时前
Java并发编程:Executors框架类深度解析
java·开发语言·并发
南极企鹅2 小时前
深入理解 MVCC:数据库并发控制的基石
java·数据库·mysql