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

news2025/1/17 0:48:13

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.小结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1287407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【代码随想录】算法训练计划39

dp 1、62. 不同路径 题目: 求路径方案多少个 思路: 这道题就有点dp了哈 func uniquePaths(m int, n int) int {//dp,写过,代表的是多少种// 初始化dp : make([][]int, m)for i : range dp {dp[i] make([]int, n)dp[i][0] 1 // 代表到…

【5】PyQt按钮

QPushButton 常见的按钮实现类包括:QPushButton、QRadioButton和QCheckBox QPushButton是最普通的按钮控件,可以响应一些用户的事件 from PyQt5.QtWidgets import QApplication, QWidget, QPushButton import sysdef func():print("按下按钮啦,火…

MPC模型预测控制理论与实践

一、基本概念 最有控制的动机是在约束条件下达到最优的系统表现。 模型预测控制(MPC,Model Predictive Control)是通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,通常用离散型状态空间表…

随机链表的复制[中等]

优质博文:IT-BLOG-CN 一、题目 给你一个长度为n的链表,每个节点包含一个额外增加的随机指针random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成,其中每个新节点的值都设为…

【论文笔记】A Transformer-based Approach for Source Code Summarization

A Transformer-based Approach for Source Code Summarization 1. Introduction2. Approach2.1 ArchitectureSelf-AttentionCopy Attention 2.2 Position Representations编码绝对位置编码成对关系 1. Introduction 生成描述程序功能的可读摘要称为源代码摘要。在此任务中&…

C++ day55 判断子序列 不同的子序列

题目1:392 判断子序列 题目链接:判断子序列 对题目的理解 判断字符串s是否为t的子序列 字符串s和字符串t的长度大于等于0,字符串s的长度小于等于字符串t的长度,本题其实和最长公共子序列的那道题很相似,相当于找两…

面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题

面试就是这么简单,offer拿到手软(一)—— 常见非技术问题回答思路 面试就是这么简单,offer拿到手软(二)—— 常见65道非技术面试问题 面试就是这么简单,offer拿到手软(三&#xff…

【数据结构(七)】查找算法

文章目录 查找算法介绍1. 线性查找算法2. 二分查找算法2.1. 思路分析2.2. 代码实现2.3. 功能拓展 3. 插值查找算法3.1. 前言3.2. 相关概念3.3. 实例应用 4. 斐波那契(黄金分割法)查找算法4.1. 斐波那契(黄金分割法)原理4.2. 实例应用 查找算法介绍 在 java 中,我们…

【Midjourney实战】| 新年礼盒元素设计

文章目录 1 初步提示词2 润色提示词3 提示词发散联想 这期实践任务,我们想去做一个新年礼盒的效果,最后我们想把不同元素拼在一起,方便后期进行新年的相关设计 1 初步提示词 提示词初步我们乍一想,肯定要包括主体元素礼盒 新年礼…

APOLLO自动驾驶技术沙龙:未来已来,共创智能交通新时代

在这次Apollo会议上,我深刻地感受到了人工智能自动驾驶技术领域的最新进展和未来趋势。作为一名从事软件开发工作的人员,我深感荣幸能够参加这次盛会。 前言 本次活动是百度Apollo社区工程师齐聚首钢Park,带来现场实操与技术分享。主要围绕Ap…

好用的挂耳式蓝牙耳机有哪些?四款好用高性价比的耳机推荐

随着生活节奏的加快,挂耳式蓝牙耳机真的是越来越不可或缺了,不管是坐地铁、步行还是运动,一副好用的挂耳式蓝牙耳机都能让你感觉自己像是生活里的主角。但市面上的选择实在是太多了,简直让人眼花缭乱,不过我找了四款真…

仓库管理系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址: 更多系统资源库地址:更多Java课设系统 更多系统运行效果展示…

很全面 影响无人机自动返航的因素总结

在无人机技术不断成熟的今天,自主返航技术成为保障飞行安全的一种重要工具。无人机在多种情况下能够智能判断,主动实施返航动作,为用户提供更加可靠的飞行保障。以下是一些常见的无人机自动返航场景,让我们深入了解这项技术背后的…

玩转数据8:数据质量管理与数据清洗的实践

引言 在当今数字化时代,数据质量管理和数据清洗对于企业和组织来说变得至关重要。随着大数据的快速增长和数据驱动决策的普及,确保数据的准确性、一致性和完整性成为保证业务成功的关键因素。本文将探讨数据质量管理和数据清洗的概念、目标以及其在Java…

U-Net网络模型改进(添加通道与空间注意力机制)---亲测有效,指标提升

U-Net网络模型(注意力改进版本) 这一段时间做项目用到了U-Net网络模型,但是原始的U-Net网络还有很大的改良空间,在卷积下采样的过程中加入了通道注意力和空间注意力 。 常规的U-net模型如下图: 红色箭头为可以添加的…

电表峰谷平是怎么分时间的?

电表的峰谷平时间是指电力公司根据电力需求的不同,将一天的时间划分为不同的时段,以此来确定不同时间段内的电费价格。这种不同时段对应不同电费价格的制度,旨在更好地平衡电力供需,促进能源的高效利用。 首先,我们来了…

记录一下Mac配置SpringBoot开发环境

由于很多项目喜欢使用传统的 Java 8 进行开发,而且 Java 8 的稳定性也是经过长久考验的,我们接下来就尝试一下,在一台新的 Mac 中配置 Java 环境,并且开始创建 SpringBoot 项目。 首先,去 Oracle 官网下载 java8 JDK …

springboot详解Mybatis-Plus中分页插件PaginationInterceptor标红

1.问题描述 在springboot项目中,类中引用PaginationInterceptor,标红,如下图所示: 2.问题分析 可能是因为pom.xml中的配置原因,导致不支持PaginationInterceptor 3.解决问题 更换版本后 更换后,记得Rel…

开发的客户收到样品表示质量不如原供应商如何应对

有小伙伴问,在开发客户的过程当中,给客户寄了样品,客户说他的样品没有原来供应商的好怎么办? 这个问题我们来想一下,客户既然愿意把地址给我们,愿意去接你的样品,说明什么?说明客户…

【剑指offer|图解|位运算】训练计划VI+撞色搭配

🌈个人主页:聆风吟 🔥系列专栏:数据结构、剑指offer每日一练 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. ⛳️训练计划VI(题目难度:中等)1.1 题目1.2 示例1.3 …