当前位置: 首页 > news >正文

17.认识下Docker之docker的核心原理(2)

1.容器-我的小世界

不知道大家看没看过小说《完美时间》,里面石昊经常进入一个小世界在里面与世隔绝的修炼或者战斗,总之就是在一个完全封闭的空间里做他想做的事情而与外界隔离,不受侵扰。通过前面的分析我们知道,Namepace让应用进程只能看到该 Namespace 内的“小世界”;而 Cgroups 的作用是“限制”,它给这个“小世界”围上了一圈看不见的封印。在小说中的“小世界”,不仅仅是这么一个空间,里面如同一个真实世界一样,有大地及大地上的各种物品,对比到容器,那么容器这个小世界还缺少文件系统,比如启动一个ubuntu或者centos容器,里面我们看到是一份完整的操作系统目录,这个文件系统就是通过Mount Namescpace来实现的。当我们启动容器进程时,先启用Mount Namespace,然后挂载指定的目录。
下面是我启动的一个centos的容器,然后进入到容器,
在这里插入图片描述
我们看到,根目录下我们看到的真实的操作系统一样,是一个完整的操作系统文件。这是为了让容器这个根目录看起来更真实,一般会在容器的根目录下挂载一个完整操作系统的文件系统,我们把这个文件系统就是所谓的“容器镜像image”,学名rootfs(根文件系统)。由于Monut Namespace的存在,这个挂载对宿主机不可见,只对当前容器进程起作用,这样就可以随便在容器内部折腾了。那这是怎么做到的呢?
其实在 Linux 操作系统里,有一个名为 chroot 的命令,可以在 shell 中方便地完成这个工作。它的作用就是帮我们“change root file system”,即改变进程的根目录到你指定的位置。
所以,docker运行容器,就是在宿主机上运行一个特殊的进程,docker为这个进程启动Linux Namespace配置,设置指定的Cgroups参数、切换进程的根目录(Change Root)。
虽然这里的rootfs根文件系统包含了一个操作系统完整的文件、目录和配置,但是却没系统内核,操作系统只有在开机的时候才会加载指定版本的内核镜像。也就是说,rootfs很像一完美时间小说中仙体,只有躯壳,没有灵魂。
部署在同一台机器上的所有容器,都共享宿主机操作系统的内核。

2.镜像-对环境一致性的理解

在开始的一掌节,我也介绍了docker的好处,就是保持环境的一致性,这里再加深一下理解。拿java项目来说,这里所说的环境一致性,不仅仅是说用的jar包的版本一致、jdk的版本一致,更重要的是,来操作系统都一致,正式这种深入到操作系统级别的运行环境一致性,才打通了应用在本地开发和远端执行环境之间难以逾越的鸿沟。

3.镜像-联合文件系统

对于联合文件系统,之前我也提过,但并不是太详情,这里我以示例的方式说名一下,从根本上理解这个东西。

3.1 联合文件系统-overlayfs

现在docker使用的联合文件系统时overlay,这里我们先简单说一下overlayfs。overlayfs联合文件系统可让你使用2个目录挂载文件系统:“下层”目录和“上层”目录。文件系统的下层目录是只读的,文件系统的上层目录可以读写。当进程“读取”文件时,overlayfs文件系统驱动将优先在上层目录upperdir中查找并从该目录中读取文件,找不到则在下层目录lowerdir中查找。当进程"写入"文件时,overlayfs会将其写入上层目录upperdir。

3.2 联合文件系统-overlayfs演示示例

这里我就以overlay来演示一下。

首先创建几个目录:在myfile下创建lower、upper、work、merged

mkdir -p myfile/lower myfile/upper myfile/work myfile/merged

然后,我在upper目录下创建a.txt,m.txt两个文件,在lower目录下,创建b.txt,m.txt
在这里插入图片描述
执行挂载命令:

mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work /myfile/merged

解释下这个命令
lowerdir参数:下层目录,可以挂载多个下层目录,多个目录之间采用分号分隔,如下所示:

mount -t overlay overlay -o lowerdir=/dir1:/dir2:/dir3 ./merged

upperdir参数:上层目录;
merged目录:lower和upper合并后的虚拟目录。同时也是容器挂载点 ,lowerdir和upperdir整合起来提供统一的视图给容器,作为根文件系统;
查看merged目录下的文件
在这里插入图片描述
我们看到,x.txt显示的是upper目录的内容。

3.3联合文件系统-overlayfs合并规则

我这里就不一一演示了,把合并和读写规则说一下;
合并规则整理如下:
1.读规则:

  • upper没有, 而lower有的文件时,需从lower读;
  • 只在upper有的文件时,则直接从 upper 读
  • lower 和 upper 都有的文件时,则直接从 upper 读。

2.写规则:

  • 对只在 upper 有的文件时,则直接在 upper 写
  • 对在lower 和 upper 都有的文件时,则直接在 upper 写。
  • 对只在 lower 有的文件写时,则会做一个拷贝的操作,先从 lower将文件拷贝一份到upper,写的操作只对从lower 复制到 upper 的文件生效,而 lower 还是原文件。

3.删除规则:

  • lower 和 upper 都有的文件,upper 的会被删除,在 upper 目录下创建一个 ‘without’ 文件,而 lower 的不会被删除。
  • lower 有而 upper 没有的文件时,会为被删除的文件在 upper 目录下创建一个 ‘without’ 文件,而 lower 的不会被删除。
  • lower 和 upper 都有的目录时,upper 的会被删除,在 upper 目录下创建一个类似‘without’ 文件的 ‘opaque’ 目录,而 lower 的不会被删除

3.镜像-分层

之前我们介绍过,镜像制作是分层的,Dockerfile中的每一个命令都是一个层。那么为什么要分层呢?其实就是考虑镜像的复用性。·
加入我现在在用 Centos7.6操作系统做了一个 image,然后又在里面安装了 Java 环境,用来部署我的 Java 应用。这时其他人也希望能够直接使用我安装过 Java 环境的 image,而不是重复这个流程。那怎么办号呢?
我想到的比较简单的方法是在制作镜像的时候,每做一步“有意义”的操作,就保存一个镜像出来,这样其他人就可以按需求去用他需要的 rootfs 了。可一旦其他人修改了这个镜像,新旧两个新旧两个镜像之间就没有任何关系了。这样做的结果就会产生非常的没有任何关联的镜像,也就是碎片化严重。那么,既然这些修改都基于一个旧的 image,我们能不能以增量的方式去做这些修改呢?这样做的好处是,所有人都只需要维护相对于 base rootfs 修改的增量内容,而不是每次修改都制造一个“fork”。由此,产生了分层的概念。Docker 在镜像的设计中,引入了层(layer)的概念。即用户制作镜像的每一步操作,都会生成一个层,也就是一个增量镜像。镜像主要分为三个层:只读层、可读写层、init层。

3.1镜像-只读层

只读层,位于联合文件系统的最下层,对应overlayfs中的lower目录;

3.2镜像-可读写层

可读写层,位于联合文件系统的最上层,对应overlayfs中的upper目录中。他也称为容器层,在没有写入文件之前,这个目录是空的。而一旦在容器里做了写操作,你修改产生的内容就会以增量的方式出现在这个层中。
所以,最上面这个可读写层的作用,就是专门用来存放你修改 rootfs 后产生的增量,无论是增、删、改,都发生在这里。

3.3镜像-init层

它是一个以“-init”结尾的层,夹在只读层和读写层之间。Init 层是 Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts、/etc/resolv.conf 等信息。

3.4.镜像分层-copy-on-write

这里还有一个copy-on-write机制,这里简单说一下。
我们知道,最上面的可读写层也被称为容器层,下面的只读层称为镜像层,所有的增删查改操作都只会作用在容器层,相同的文件上层会覆盖掉下层。比如修改一个文件的时候,首先会从上到下查找有没有这个文件,找到,就复制到容器层中,然后在容器层中修改,修改的结果就会作用到下层的文件,这种方式也被称为copy-on-write。

4.小结

这一篇博客我感觉写的不是很好,还是没能组织好语言透彻的说明这个原理。看看后续有时间再重新写吧。这个就先这样吧。

相关文章:

17.认识下Docker之docker的核心原理(2)

1.容器-我的小世界 不知道大家看没看过小说《完美时间》,里面石昊经常进入一个小世界在里面与世隔绝的修炼或者战斗,总之就是在一个完全封闭的空间里做他想做的事情而与外界隔离,不受侵扰。通过前面的分析我们知道,Namepace让应用…...

【EasyExcel实践】万能导出,一个接口导出多张表以及任意字段(可指定字段顺序)

文章目录 前言正文一、POM依赖二、核心Java文件2.1 自定义表头注解 ExcelColumnTitle2.2 自定义标题头的映射接口2.3 自定义有序map存储表内数据2.4 表头工厂2.5 表flag和表头映射枚举2.6 测试用的实体2.6.1 NameAndFactoryDemo2.6.2 StudentDemo 2.7 启动类2.8 测试控制器 三、…...

代码随想录算法训练营第四十二天 _ 动态规划_01背包问题、416.分割等和子集。

学习目标: 动态规划五部曲: ① 确定dp[i]的含义 ② 求递推公式 ③ dp数组如何初始化 ④ 确定遍历顺序 ⑤ 打印递归数组 ---- 调试 引用自代码随想录! 60天训练营打卡计划! 学习内容: 二维数组处理01背包问题 听起来…...

市场上好用的aspera替代方案,你知道哪些

Aspera作为一个高速文件传输方案曾经非常受欢迎,但是其昂贵的价格却限制了许多用户的选择,因此市场上出现了众多Aspera替代方案,本文将会介绍市场上最好的Aspera替代方案。 最近几年,网络传输已成为现代商业运作中必不可少的一部…...

Stm32_串口的帧(不定长)数据接收

目录标题 前言1、串口中断接收固定帧头帧尾数据1.1、任务需求1.2、实现思路1.3、程序源码: 2、串口中断接收用定时器来判断帧结束3、串口中断接收数据空闲中断3.1、串口的空闲中断3.2、实现思路3.3、程序源码 4、串口的空闲中断DMA转运4.1、DMA简介4.2、DMA模式4.3、…...

L0、Linux常用命令

一、防火墙: 在 Linux 中,关闭防火墙可以使用不同的命令,这取决于你所使用的防火墙软件。在一些常见的 Linux 发行版中,防火墙可能是 iptables 或 firewalld两种: centos6使用iptables作为默认防火墙;cento…...

Golang实践录:读取toml配置

本文对 toml 文件进行解析。 下载 对于toml格式文件,golang 有很多库可以解释 yaml 文件,如toml、viper。由于 viper 可解析格式较多,本文采用该库。 toml语法规则 toml语法规则在官方中文文档上有说明,这里直接使用。 TOML 是…...

超大规模集成电路设计----基于阵列的可编程逻辑(七)

本文仅供学习,不作任何商业用途,严禁转载。本篇文章绝大部分资料来自中国科学院段成华教授PPT 超大规模集成电路设计----基于阵列的可编程逻辑(七) 7.1 引言7.1.1.回顾7.1.2. 数字逻辑系列Digital Logic Families7.1.3.从定制到半…...

深入探索FastAPI单元测试:使用TestClient轻松测试你的API

原文:深入探索FastAPI单元测试:使用TestClient轻松测试你的API-51CTO.COM 当使用FastAPI进行单元测试时,一个重要的工具是TestClient类。TestClient类允许我们模拟对FastAPI应用程序的HTTP请求,并测试应用程序的响应。这使我们能…...

基于ssm小型企业办公自动化系统论文

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对小型企业办公信息管理混乱,出错率高,信息安全…...

CasADi - 最优控制开源 Python/MATLAB 库

系列文章目录 文章目录 系列文章目录前言一、介绍1.1 CasADi 是什么?1.2 帮助与支持1.3 引用 CasADi1.4 阅读本文档 二、获取与安装三、符号框架3.1 符号 SX3.1.1 关于命名空间的说明3.1.2 C 用户注意事项 3.2 DM3.3 符号 MX3.4 SX 和 MX 混合使用3.5 稀疏类3.5.1 获…...

Java中使用String字符串的注意事项

引言 介绍字符串在Java中的重要性和普遍性,以及本文将讨论的注意事项。 1. 字符串是不可变的 解释Java中字符串是不可变的概念,即一旦创建,字符串对象的值就不能被修改。强调在对字符串进行操作时应当创建新的字符串对象而不是修改原有的对…...

离线数仓构建案例一

数据采集 日志数据(文件)到Kafka 自己写个程序模拟一些用户的行为数据,这些数据存在一个文件夹中。 接着使用flume监控采集这些文件,然后发送给kafka中待消费。 1、flume采集配置文件 监控文件将数据发给kafka的flume配置文件…...

nginx优雅如何优雅的接管【跨域配置】

跨域问题太常见了,这里不做详细赘述。文章主要想说一下,如何统一管理和更好的来管理 跨域配置 跨域的常见配置有两种 后台代码设置和网关设置 1、后台代码设置 以springboot为例代码如下(水一下文章长度...) Configuration pu…...

远离危险的购买手机的渠道

今年上半年从淘宝特价版上面的官方旗舰店买了一个oppo手机,第一次买我打算不要了,所以就退了回去,过了几天我又觉得还是买一个比较好,所以就又买了一个,型号我绝不说了700-1000z这个价位的手机带个高通骁龙芯片的&…...

外包干了2个多月,技术明显有退步了。。。。。

先说一下自己的情况,本科生,19年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...

【Java项目管理工具】Maven

Maven 文章目录 Maven一、简介二、安装和配置三、GAVP四、IDEA Maven Java Web工程五、插件、命令、生命周期六、依赖配置七、构建配置八、依赖传递与依赖冲突九、Maven工程继承和聚合关系9.1 工程继承关系9.2 工程聚合关系 十、Maven私服10.1 Nexus下载安装10.2 Nexus上的各种…...

solidity案例详解(六)服务评价合约

有服务提供商和用户两类实体,其中服务提供商部署合约,默认诚信为true,用户负责使用智能合约接受服务及评价,服务提供商的评价信息存储在一个映射中,可以根据服务提 供商的地址来查找评价信息。用户评价信息&#xff0c…...

使用kubeadm搭建高可用的K8s集群

文章目录 1. 安装要求2. 准备环境3. 所有master节点部署keepalived3.1 安装相关包和keepalived3.2配置master节点3.3 启动和检查 4. 部署haproxy4.1 安装4.2 配置4.3 启动和检查 5. 所有节点安装Docker/kubeadm/kubelet5.1 安装Docker5.2 添加阿里云YUM软件源5.3 安装kubeadm&a…...

C#图像处理OpenCV开发指南(CVStar,07)——通用滤波(Filter2D)的实例代码

1 函数定义 void Filter2D (Mat src, Mat dst, int ddepth, InputArray kernel, Point anchor Point(-1,-1), double delta 0, int borderType BORDER_DEFAULT ) 1.1 原型 #include <opencv2/imgproc.hpp> Convolves an image wit…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...