第四章 镜像原理

ops/2024/9/30 0:25:16/

目录

一、联合文件系统

二、镜像加载原理

三、分层理解


一、联合文件系统

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

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

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

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

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

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

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

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

docker info | grep "Storage Driver"

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

{"storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true","overlay2.size=10GB"]}

重启Docker守护进程:

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


http://www.ppmy.cn/ops/118650.html

相关文章

腾讯云SDK产品优势

全功能整合 All in One SDK 整合原直播 SDK、短视频 SDK、播放器 SDK 等多终端音视频产品于一体,全新集成终端直播、短视频、实时音视频等多项音视频能力至一个 SDK,一次接入,处处调用。 自定义组合 SDK 用户可基于真实业务场景按需勾选功…

fastadmin 搜索提交重置按钮文本修改

默认 修改require-backend.min.js文件 效果 当然最好还是去需修改lang文件 效果 如果修改没生效记得清楚一下缓存,再刷新 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你…

如何使用ssm实现校园体育赛事管理系统的设计与实现+vue

TOC ssm713校园体育赛事管理系统的设计与实现vue 绪论 课题背景 身处网络时代,随着网络系统体系发展的不断成熟和完善,人们的生活也随之发生了很大的变化。目前,人们在追求较高物质生活的同时,也在想着如何使自身的精神内涵得…

计算机毕业设计之:云中e百货微信小程序设计与实现(源码+文档+定制)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

二分查找详解(Java版)

目录 一.什么是二分查找? 二.二分查找的实现: 三.二分查找的进阶算法: 1.寻找左侧重复元素的索引值: 2.寻找元素有序排列的插入位置: 目的: 实现: 举例: 细节: …

OIDC10-OIDC常见问题与解决方案

1.ID Token验证失败 问题描述:客户端收到的 ID Token 无法通过验证,可能由于签名错误、过期或受众不匹配。 解决方案: 1)确认使用正确的公钥验证 ID Token 的签名,公钥应来自身份提供者(IdP)的元…

多线程事务管理:Spring Boot 实现全局事务回滚

多线程事务管理:Spring Boot 实现全局事务回滚 在日常开发中,我们常常会遇到需要在多线程环境下进行数据库操作的场景。这类操作的挑战在于如何保证多个线程中的数据库操作要么一起成功,要么一起失败,即 事务的原子性。尤其是在多个线程并发执行的情况下,确保事务的一致性…

32. Java栈和队列

1. 前言 栈和队列相关的题目是校招中出现频率一般,但是是属于相对基础的题型。我们要关注两类问题,栈和队列的添加和删除操作,以及栈和队列之间的区别和联系。 2. 栈和队列 2.1 数据结构 首先我们给出栈和队列的数据结构定义: (1)栈(Stack):允许在某一端插入元素(…