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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7.25 SpringBoot项目实战【我的借阅记录】

文章目录 前言一、编写控制器二、编写服务层三、Git提交前言 至此,我们已经实现 图书借阅、收藏、评论等场景,最后来到【还书】场景,首先 还书的 入口 一般 是【我的借阅记录】,在这里可以根据产品设计,对于需要归还的书 操作【还书】,所以本文来实现【我的借阅记录】。…

arm平台编译so文件回顾

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、几个点二、回顾过程 1.上来就执行Makefile2.编译第三方开源库.a文件 2.1 build.sh脚本2.2 Makefile3.最终编译三、其它知识点总结 前言 提示:这…

Python 小程序之PDF文档加解密

PDF文档的加密和解密 文章目录 PDF文档的加密和解密前言一、总体构思二、使用到的库三、PDF文档的加密1.用户输入模块2.打开并读取文档数据3.遍历保存数据到新文档4.新文档进行加密5.新文档命名生成路径6.保存新加密的文档 四、PDF文档的解密1.用户输入模块2.前提准备2.文件解密…

css 纯样式实现绘出进度条

效果: css代码: .bar{height: 14px;width: 100%;font-size: 10px;margin-top: 5px;background-color: #f5f5f5;}.bar::before{display: block;counter-reset: progress var(--precent); content: ;width: calc(1% * var(--precent));color: #fff;height:…

无公网IP环境Windows系统使用VNC远程连接Deepin桌面

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…

【C++11】右值引用与移动语义

一.左值与右值 左值:可以取地址的表示数据的表达式,左值可以出现在赋值符号左边 右值:不能取地址的表示数据的表达式,右值不能出现在赋值符号左边 int fun() {return 0; } int main() {int a 0;//a->左值const int b 1;//b-&…

把 Windows 11 装进移动硬盘:Windows 11 To Go

本篇文章聊聊如何制作一个可以“说带走就带走”的 Windows 操作系统,将 Windows11 做成能够放在 U 盘或者移动硬盘里的 WinToGo “绿色软件”。 写在前面 在《开源的全能维护 U 盘工具:Ventoy》这篇文章的最后,我提到了一个关键词 “WinToG…

【计算机网络】HTTP响应报文Cookie原理

目录 HTTP响应报文格式 一. 状态行 状态码与状态码描述 二. 响应头 Cookie原理 一. 前因 二. Cookie的状态管理 结束语 HTTP响应报文格式 HTTP响应报文分为四部分 状态行:包含三部分:协议版本,状态码,状态码描述响应头&a…

第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕

开幕快讯 2023年12月10日下午,由法国表现主义画院与东方荟萃艺术学院 联合主办的,由法中艺术交流协会、香港博物馆世界、让米歇尔艺术空 间共同协办,法国驻广州总领事馆支持的第三届《我们的世界》---2023 国际当代艺术展在广州沙面隆重启幕! 嘉宾签到现场 本次展览集合了30位活…

多平台展示预约的服装小程序效果如何

线下实体服装店非常多,主要以同城生意为主,但随着电商经济增长,传统线下自然流量变少,商家们会选择线上入驻平台开店获得更多线上用户,包括自建私域小程序等。 而除了直接卖货外,线上展示预约在服装行业也…

第16章 网络io与io多路复用select/pool/epool

第16.1节 写一个服务端代码 服务端代码 #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>#include <fcntl.h>int main() {//openint sockfd sock…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…

Tomcat头上有个叉叉

问题原因&#xff1a; 这是因为它就是个空的tomcat,并没有导入项目运行 解决方案&#xff1a; war模式&#xff1a;发布模式&#xff0c;正式发布时用&#xff0c;将WEB工程以war包的形式上传到服务器 war exploded模式&#xff1a;开发时用&#xff0c;将WEB工程的文件夹直接…

虚拟现实三维电子沙盘数字沙盘开发教程第5课

虚拟现实三维电子沙盘数字沙盘无人机倾斜摄影全景建模开发教程第5课 设置system.ini 如下内容 Server122.112.229.220 userGisTest Passwordchinamtouch.com 该数据库中只提供 成都市火车南站附近的数据请注意&#xff0c;104.0648,30.61658 在鼠标指定的位置增加自己的UI对象&…

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果&#xff1a; .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…

虚幻学习笔记10—C++函数与蓝图的通信

一、前言 除了上一章C变量与蓝图通信讲的变量能与蓝图通信外&#xff0c;还有函数和枚举也可以和蓝图通信。函数的关键字为”UFUNCTION“、枚举的关键字为”UENUM“。 二、实现 2.1、BlueprintCallable蓝图中调用 该函数时带执行的&#xff0c;带入如下。编译成功后在蓝图中输…

Android 11 适配——整理总结篇

背景 > 经过检测&#xff0c;我们识别到您的应用&#xff0c;目前未适配安卓11&#xff08;API30&#xff09;&#xff0c;请您关注适配截止时间&#xff0c;尽快开展适配工作&#xff0c;避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

【算法】递归、搜索与回溯算法

文章目录 一. 名词解释1. 递归1.1 什么是递归&#xff1f;1.2 为什么会用到递归&#xff1f;1.3 如何理解递归&#xff1f;1.4 如何写好一个递归&#xff1f; 2. 遍历和搜索3. 回溯和剪枝 二. 递归系列专题1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点…

git自动更新功能

确认权限 因为一般Linux系统网页用的www 或 www-data用户和用户组&#xff0c;所以要实现自动来去&#xff0c;首先要在www用户权限下生成ssh密钥&#xff0c;不然没有权限&#xff0c;其次就是&#xff0c;要把用root用户拉去的代码&#xff0c;批量改成www用户 1. 给www权…

Unity | 渡鸦避难所-2 | 搭建场景并添加碰撞器

1 规范项目结构 上期中在导入一系列的商店资源包后&#xff0c;Assets 目录已经变的混乱不堪 开发过程中&#xff0c;随着资源不断更新&#xff0c;遵循一定的项目结构和设计规范是非常必要的。这可以增加项目的可读性、维护性、扩展性以及提高团队协作效率 这里先做下简单的…