【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度

容器里的进程‘看到’’的文件系统

可能你立刻就能想到,这应该是一个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统°这样它就可以在自己的容器目录(比如 /tmp)下进行操作’而完全不会受宿主机以及其他容器的影响。

容器迸程哪些目录需要重新挂载’比如这个/tmp目录。
可以看到’容器里的/tmp目录是以tmpfS方式单独挂载的。容器以tmpfS(内存盘)格式重新挂载/tmp目录。
在这里插入图片描述
这就是Mount Namespace跟其他Namespace的使用略有不同的地方:它对容器进程视图的改变—定要伴随着挂载操作才能生效。

假设有—个$HOME/test目录’你想把它作为—个/bin/bash进程的根目录。

执行chroot t命令’告诉操作系统我们将使用$HOME/test目录作为/bin/bash进程的根目录。

这个挂载在容器根目录上用来为容器进程提供隔离后执行环境的文件系统’就是所谓的容器镜像。 它还有—个更专业的名字: rootfs(根文件系统)。

dock 最核心原理

Docker项目最核心的原理实际上就是为待创建的用户进程。

  • 启用Linux Namespace配置;
  • 设置指定的Cgroups参数;
  • 切换进程的根目录(change root)

rootfs 只是—个操作系统所包含的文件、配置和目录’并不包括操作系统内核。
在Llnux操作系统中这两部分是分开存放的’操作系统只有在开机启动时才会加载指定版本的内核镜像。

rootfS只是—个操作系统所包含的文件、配置和目录’并不包括操作
系统内核°在Llnux操作系统中’这两部分是分开存放的’操作系统只有在开机启动时才会加载指定版本的内核镜像°

正是由于rootfS的存在’容器才有了—个被反复强调至今的重要特:一致性

由于云端与本地服务器环境不同’因此应用的打包过程一直是使用PaaS时最麻烦的一个步骤。

’有了容器镜像(rootfs)之后,这个问题就被非常优雅地解决了。由于root色里打包的不只是应用’而是整个操作系统的文件和目录,这就意味着’应用以及它运行所需要的所有依赖都被封装在了一起。

难道每开发—个应用或者升级现有应用’都要重复制作—次rootfS吗? 既然这些修改都基于—个旧的rootfs 我们能否以增量的方式去做这些修改呢? 这样所有人都只需要维护相对于base rootfs修改的增量内容。

docker在镜像的设计中引人了层(layer)的概念。也就是说,用户制作镜像的每一步操作都会生成—个层,也就是一个增量 rootfs。

用到了—种叫作UnionFS(unlon∏lesystem’联合文件系统)的能力。它最主要的功能是将不|司位置的目录联合挂载(unionmount)到同—个目录下。比如有两个目录A和B它们分别有两个文件:
在这里插入图片描述
在这个合并后的目录C里’有a、b、x这3个文件并且x文件只有一份。这就是合并的含义。此外,如果你在目录C里对a、b、x文件做修改’这些修改也会在对应的目录A、B中生效

docker run-d ubuntu:latest sleep 3600

这个所谓的‘镜像”’实际上就是一个Ubuntu操作系统的rootfs,它的内容是Ubuntu操作系统的所有文件和目录不过, 与之前介绍的rootfs稍微不同的是, Docker镜像使用的 rootfs往往由多个“层”组成。
在这里插入图片描述
挂载点就是 /var/lib/docker/aufs/mnt/<ID>, AuFS 作为docker 的存储,当前不再使用。

5个镜像层是如何被联合挂载成这样—个完整的Ubuntu文件系统的呢
在这里插入图片描述
在这里插入图片描述
ro+wh 即 readonly+whiteout(删除的时候使用)。
在这里插入图片描述

只读层

这些层都以增量的方式分别包含了Ubuntu操作系统的—部分。

可读写层

你要删除只读层里一个名为foo的文件那么这个删除操作实际上是在可读写层创建了—个名为 .wh.foo的文件。而当我们使用完了这个修改过的容器之后,还可以使用 docker commit 和 push指令保存这个修改过的可读写层’并上传到DockerHub上供他人使用。

Init 层

Init层是—个以-init 结尾的层,夹在只读层和可读写层之间。Init层是Docker项目单独生成的—个内部层’专门用来存放/etc/hosts、 /etc/resolvconf 等信息。

但是用户往往需要在启动容器时写人一些指定的值(比如hostname) 所以需要在可读写层修改它们。
可是这些修改往往只对当前的容器有效,我们并不希望执行 docker commit 时把这些信息连同可读写层一起提交。
所以,Docker做法是在修改了这些文件之后以—个单独的层挂载出来。而用户执
行 docker commit 只会提交可读写层,因此不包含这些内容。

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

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

相关文章

c语言编程题经典100例——(31~35例)

1&#xff0c;实现深度优先搜索算法。 以下是使用 C 语言实现深度优先搜索算法的示例代码&#xff1a; #include <stdio.h> #include <stdbool.h> #define MAX_VERTICES 100 // 图的最大顶点数 // 图的邻接表表示 typedef struct { int edges[MAX_VERTIC…

充电桩绝缘检测原理与示例

1、背景 充电桩绝缘检测是保证电动车充电安全的重要环节&#xff0c;通过对充电桩绝缘检测单租的测量和评估&#xff0c;来判断充电桩是否存在漏电等安全隐患&#xff0c;从而保证用户及周围环境的电器安全。 绝缘电阻&#xff1a;是指在特定的条件下&#xff0c;电气设备与接…

python之高级语法

文章目录 版权声明property属性property属性装饰器方式property属性类属性方式 with语句和上下文管理器with语句使用\上下文管理器定义 生成器生成器推导式创建生成器的方式生成器推导式yield 关键字 浅拷贝和深拷贝可变类型和不可变类型浅拷贝深拷贝总结 正则表达式正则表达式…

VR全景技术助力政务服务大厅数字化,打造全新政务服务体验

引言&#xff1a; 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术逐渐走进人们的视野。VR全景技术作为VR领域的一项重要应用&#xff0c;以其沉浸式、交互式的特点&#xff0c;正逐渐渗透到各行各业。政务服务大厅作为相关部门与民众之间的桥梁&#…

83基于matlab 的时钟时间识别GUI

基于matlab 的时钟时间识别GUI。图像去除背景-转化为二值化图像-找出对应的直线边缘-找到秒针、分针、时针对应的直线&#xff0c;并算出斜率、角度-判断时间&#xff0c;分针与时针 &#xff08;度数&#xff09;。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运…

10 OAuth2.0实战:认证授权中心搭建

木谷博客系统的认证授权中心使用Spring Cloud Security+OAuth2搭建,完全遵循OAuth2.0规范。 实战部分只介绍木谷博客系统中的重点,关于细节请看笔者之前的文章:实战干货!Spring Cloud Gateway集成OAuth2.0 实现分布式统一认证授权! 客户端信息存储 OAuth2.0中的四种模式…

以太坊2.0-升级节点详细搭建文档

文章目录 一、配置 JWT 认证二、部署执行节点geth2.1 下载geth二进制文件2.2 geth节点启动三、部署共识节点Prysm3.1 下载Prysm脚本3.2 Prysm容器生成四、检查节点是否同步完成4.1 检查geth执行节点4.2 检查prysm共识节点4.3 geth常用命令一、配置 JWT 认证 使用执行客户端生成…

网易云音频数据如何爬取?

在当今数字化时代&#xff0c;音频数据的获取和处理变得越来越重要。本文将详细介绍如何使用Objective-C语言构建音频爬虫程序&#xff0c;以爬取网易云音乐为案例。我们将从Objective-C的基础知识开始&#xff0c;逐步深入到爬取思路分析、构建爬虫框架、完整爬取代码等方面&a…

P18 C++ 继承

目录 前言 01 不使用继承会让你多打很多无用的代码 02 继承 最后的话 前言 本期我们学习 C 面向对象编程中的继承。 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类&#xff0c;这使得创建和维护一个应用程序变得更容易。这样做&#…

Flask 实现Token认证机制

在Flask框架中&#xff0c;实现Token认证机制并不是一件复杂的事情。除了使用官方提供的flask_httpauth模块或者第三方模块flask-jwt&#xff0c;我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌&#xff08;Token&#xff09;&…

RPG项目01_UI登录

首先创建一个项目 将资源包导进Resources文件夹 创建一个Scripts脚本文件夹 然后再对Scripts脚本文件夹分门别类 导入UI资源包 创建一个Image 按住Alt 选择右下角 image就会覆盖整个面板 修改image名字为BG 将image图片放置背景栏 再创建一个image 改名为MainMenu 修改MainMenu…

【深度学习笔记】02 线性代数基础

线性代数基础 线性代数基础标量向量长度、维度和形状矩阵张量算法的基本性质降维非降维求和点积&#xff08;Dot Product&#xff09;矩阵-向量积矩阵-矩阵乘法范数 线性代数基础 标量 标量由只有一个元素的张量表示 import torchx torch.tensor(3.0) y torch.tensor(2.0)…

一文读懂 | AI技术如何驱动企业供应链智能化,赋能企业降本增效?

近年以来&#xff0c;随着互联网技术的发展&#xff0c;AI的创新研究加速。随着大数据、云计算、物联网等信息技术的发展&#xff0c;以深度神经网络为代表的AI技术迅速发展&#xff0c;图像分类、语音识别、知识问答、无人驾驶等AI技术实现了从“不能用、不好用”到“可以用”…

Mybatis入门(一)

安装 要使用 MyBatis&#xff0c; 只需将 mybatis-x.x.x.jar 文件置于类路径&#xff08;classpath&#xff09;中即可。 如果使用 Maven 来构建项目&#xff0c;则需将下面的依赖代码置于 pom.xml 文件中&#xff1a; <dependency><groupId>org.mybatis</gr…

HarmonyOS开发(七):构建丰富页面

1、组件状态管理 1.1、概述 在应用中&#xff0c;界面一般都是动态的。界面会根据不同状态展示不一样的效果。 ArkUI作为一种声明式UI&#xff0c;具有状态驱动UI更新的特点&#xff0c;当用户进行界面交互或有外部事件引起状态改变时&#xff0c;状态的变会会触发组件的自动…

2023.11.26 关于 Spring Boot 单元测试

目录 单元测试 优势 单元测试的使用 具体步骤 实现不污染数据库 阅读下面文章之前 建议点击下方链接了解 MyBatis 的创建与使用 MyBatis 的配置与使用 单元测试 单元测试 指对软件中的最小可测试单元进行检查和验证的过程单元测试 由开发人员在编码阶段完成&#xff0c;…

优化前端性能

一次在前端面试中问到优化前端性能的方式 一、主要通过两种方式&#xff1a; reflow(回流)和repaint(重绘)。整个在浏览器的渲染过程中&#xff08;页面初始化&#xff0c;用户行为改变界面样式&#xff0c;动画改变界面样式等&#xff09;reflow(回流)和repaint(重绘) 会大大影…

数据结构—树

文章目录 9.树(1).树的基本概念#1.基本定义#2.树的广义表表示法#3.基本术语 (2).树的存储结构#1.标准形式(常用)#2.逆存储形式#3.孩子兄弟存储法 (3).并查集#1.我们到底想解决什么问题#2.并查集结点#2.Find(查)#3.Union(并)#4.例子 (4).树的遍历#1.前序遍历#2.后序遍历#3.遍历的…

winform联合halcon读取图像出现问题

1.在Form1.cs和Form.Designer.cs中添加using HalconDotNet&#xff1b; 2. 3.添加Halcon导入.cs的程序 4.注释掉导出文件的主函数&#xff0c;不然会报错。 .

Python 安装 启动项目 有线版/离线版

测试机器&#xff1a;Linux Centos7 一&#xff0c;安装Python 有线版&#xff1a; 1、首先检查机器的gcc版本&#xff08;要求版本在4.8.5&#xff09; gcc --version 2、安装前置依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel rea…