第四章 镜像原理

目录

一、联合文件系统

二、镜像加载原理

三、分层理解


一、联合文件系统

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***4956几秒前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
保加利亚的风2 分钟前
【Java】Spring Boot Event事件驱动开发:使用 ApplicationEvent 实现解耦通信
java·驱动开发·spring boot
曹牧7 分钟前
C#:<SubType>Component</SubType>
开发语言·c#
豆奶特浓612 分钟前
谢飞机勇闯Java面试:从内容社区的缓存一致性到AI Agent,这次能飞多高?
java·微服务·ai·面试·架构·缓存一致性·feed流
Pou光明13 分钟前
7_线程安全_线程间的内存可视性2缓存_内存屏障_读写排序
java·开发语言·缓存
CV_J17 分钟前
L12_用户菜单权限
java
来旺17 分钟前
互联网大厂Java面试实战:核心技术栈与业务场景深度解析
java·spring boot·docker·kubernetes·mybatis·hibernate·microservices
big-seal19 分钟前
XML解释
xml·java·数据库
m***119026 分钟前
Spring BOOT 启动参数
java·spring boot·后端
m***667327 分钟前
Python 爬虫实战案例 - 获取社交平台事件热度并进行影响分析
开发语言·爬虫·python