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

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒,沙盒技术顾名思义就是像一个集装箱一样,把应用(服务,进程之类的)装起来的技术,这样每个进程在自己的沙盒中和其他的沙盒隔离开来,每个沙盒之间存在一个边界使得他们互不干扰,而被装入这个盒子中的应用也就很方便的可以跟着沙盒搬来搬去,这是一种很方便很理想的管理状态。
于是围绕这个状态的实现,需要一种可以真实落地的技术。也就是隔离和限制技术。

一、Namespace隔离技术

1、隔离的现象

我们说容器的核心功能就是通过约束和修改进程的动态表现,从而创造出一个边界,而Cgroups技术就是用来制造约束的能力,而我们这里要说的NameSpace则是用来修改进程的视图的技术,修改视图其实就是修改进程视角下自己能看到的内容。
我们先来操作一下,所以我们需要准备一个Linux环境和docker项目,至于你是哪个Linux的发行版本这不重要。我的环境如下:

CentOS Linux release 7.8.2003
Docker Engine - Community 20.10.14

首先我们先创建一个容器:执行docker run -it busybox /bin/sh命令来创建容器

#root  docker run -it busybox /bin/sh
这句命令的参数我们逐一来解释一下:
-it :在启动docker容器之后,给我们分配一个文本的输入输出环境,有了这个输入输出环境,我们就能在输入端和docker交互然后在输出端
获得交互的结果。/bin/sh :就是我们在docker容器中运行的程序,bin/sh是一个常用的shell。所以上面这句话的意思最终表达就是:请帮我启动一个容器,并且在容器里面执行/bin/sh这个shell,并且在启动之后就分配一个命令行的
终端来让我和这个容器交互。

在做完了以上操作之后,我的Linux机器就变成了宿主机,而这个运行着/bin/sh的容器 busybox 就运行在我的这台宿主机里。

在执行完以上这句命令之后,其实我们就进入了容器内部,并且可以通过终端交互。界面如下。
在这里插入图片描述
此时我们在交互终端指定ps,列出容器内的所有进程。
在这里插入图片描述
我们发现里面只有两个进程,我们在启动时运行的/bin/sh就是这个容器内部的一号进程(PID为1),第二个则就是我们执行的ps进程。此时这两个进程已经被隔离在我们这个容器中了。也就是所谓的沙盒世界。那么其中的原理又是为何呢?

2、隔离的原理

本来在我们没有容器的时候,我们直接在宿主机上运行一个/bin/sh程序,此时就会启动一个/bin/sh的进程,操作系统就会给他这个进程分配一个进程ID(PID),这个类似于编号一样的PID,是这个进程的唯一标识,就像一个公司中的员工的工号一眼。比如系统为他分配的是100,那么他就等同于工号为100的员工。公司的boss就是编号为1的员工。

但是此时我们有了容器了,当我们把程序运行在容器中的时候,docker就会给这个进程施展一个障眼法,让他感知不到前面的进程,看不到其他前面的99个员工,此时他就以为自己是1号员工,此时他就在一种忽悠的状态下,认为自己的ID就是1。

所以这种机制类比在linux中,就是在隔离的空间中运行的进程只能看到计算过后的编号,PID=1。实际上,你还是在操作系统上运行,在操作系统的视角看,你还是你100号员工,妄想成为1号,那是你自己认为。
这就是Linux中的Namespace机制,而对应在Linux中的实现中,namespace的实现方式,其实就是Linux创建进程的一个传入的可选参数,在linux中创建进程的系统函数为clone(),也就是如下:

int pid = clone(main_function,stack_size,SIGCHLD,NULL);
这行代码会创建一个进程,然后返回值是这个进程的PID,也就是那个编号。而玄机就在第三个参数中,第三个
形参可以有两种传入实参,CLONE_NEWPID和SIGCHLD,当我们传入的是SIGCHLD就创建真实的进程,不做任何
障眼法,而当我们把参数指定为CLONE_NEWPID,创建出来的进程,就会在自己的视角看到一个全新的空间,在
这个进程空间中,他的PID就是1,而这一切都是一个障眼法,在宿主机的真实的进程空间中,他的进程PID还是
真实的数字,比如100,而不是1.

如果你创建多个这样的进程,他们自己的视角中自己都是PID=1的进程,他们看不到宿主机的真实进程空间,同时也看不到其他的沙盒里面的状况,换言之,他们实现了隔离。
而且在PID的Namespace隔离之外,Linux还提供了诸如Mount,UTS,IPC,Network,User这些Namespace,用来对其他的网络设备和其他配置做隔离,这样每个进程都只能看到自己的空间里面的隔离内容了。

二、总结

所以我们可以看到,所谓的docker容器,实际就是在创建容器进程的时候,指定了一组关于这个进程需要启动的Namespace,隔离了进程的PID,文件,设备,配置等等。而对于宿主机以及其他和这个进程不相关的进程,他是完全看不到的。

所以,容器,其实就是一种特殊的进程。只是他做了隔离。
所以在这个概念之上,我们就知道,所谓容器,在使用的时候其实并没有一个真实的容器存在,docker启动的其实还是原来的应用,只是在创建这些进程的时候docker加上了很多Namespace参数来限制进程的视角。
当限制完成之后,这些进程就觉得自己是各自的PID Namespace里面的1号进程,只能看到自己各自的Mount Namespace挂载的目录和文件,只能访问各自Network Namespace里面的网络设备,只能看到自己被限制的那一组namespace空间中的内容,仿佛与世隔绝一样。所以一切都是障眼法。

而在完成了隔离之后,在自己那一亩三分地运行的进程对于资源也是需要做限制的,而这个限制就是所谓的Cgroups技术,也就是下面的主角。

相关文章:

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒,沙盒技术顾名思义就是像一个集装箱一样,把应用(服务,进程之类的)装起来的技术,这样每个进程在自己的沙盒中和其他的沙盒隔离开来,每个沙盒之间存在一个边界使得他们互不干扰&#xff0…...

利用svm进行模型训练

一、步骤 1、将文本数据转换为特征向量 : tf-idf 2、使用这些特征向量训练SVM模型 二、代码 from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC from sklearn.m…...

【Docker】WSL 2 上的 Docker 搭建和入门

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 安装安装Docker Desktop for Windows 2️⃣ 环境配置3️⃣ hello world第一次运行再次运行分析总结 📖 参考资料 🛫 导读 开发环境 版本号描述文章日期2023-12-14操作系统Win11 - 22H222621.2715WSL2 C:…...

pytorch环境配置

1.创建环境 conda create --name pytorch python3.11.5 2.激活环境 source activate pytorch 3.添加国内镜像源: conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsin…...

电子眼+无人机构建平安城市视频防控监控方案

电子眼(也称为监控摄像机)可以通过安装在城市的不同角落,实时监控城市的各个地方。它们可以用于监测交通违法行为、监控公共场所的安全以及实时监测特定区域的活动情况。通过电子眼的应用,可以帮助警方及时发现并响应各类安全事件…...

mysql binlog_ignore_db参数的效果详解

​ 我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等)。 我们可以在mysql配置文件中关闭binlog [mysqld] skip-log-bin注意默认情况下会记录所有库的操作,那么如果我们有另类需求,比如说只让某个库记录 binglog 或排除某个库记录…...

HI3559AV100和FPGA 7K690T的PCIE接口调试记录-续

上文https://blog.csdn.net/fzktongyong/article/details/134963814?spm1001.2014.3001.5501 上一篇文中PCIE实测速度和理论计算有较大偏差,经过尝试后有所提升。 1、提升效果 1)、RC写操作,实测速度817MB/s(410407&…...

vivado约束方法4

时序约束向导 定时约束向导确定合成或上缺少的定时约束实现的设计。它分析了网表、时钟网络连接和现有的定时限制,以便根据《超快设计方法指南》提供建议用于FPGA和SoC(UG949)。以下11涵盖了三类约束页面,然后是摘要。包括以下步…...

LeetBook学习-C语言-数组

1.数组的操作 1.1 读取元素 知道内存地址可以快速访问,时间复杂度为O(1) 1.2 查找元素 从首地址开始,逐个查找,最坏时间复杂度为O(N) 1.3 插入元素 插入元素,首先位置要腾空,而后执行插入操作。 1.4 删除元素 删除掉某…...

23种策略模式之策略模式

23种策略模式之策略模式 文章目录 23种策略模式之策略模式前言优缺点使用场景角色定义UML模拟示例小结 前言 在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式&a…...

【笔试强化】Day 2

文章目录 一、选择1.2.(写错)3.4.5.6.(不会)7.(不清晰)8. (不会)9.10.(写错) 二、编程1. 排序子序列解法:代码: 2. 倒置字符串解法&am…...

windows禁用系统更新

1.在winr运行框中输入services.msc,打开windows服务窗口。 services.msc 2.在服务窗口中,我们找到Windows update选项,如下图所示: 3.双击windows update服务,我们把启动类型改为禁用,如下图所示&#xff…...

ES6原生音乐播放器(有接口)

视频展示 ES6音乐播放器 项目介绍 GutHub地址:GitHub - baozixiangqianchong/ES6_MusicPlayer: 音乐播放器 ES6_MusicPlayer 是基于JavaScriptES6Ajax等通过原生构建的项目。能够充分锻炼JS能力。 本项目有主页、详情页、歌单页面三部分组成 ├── assets&…...

Django和ECharts异步请求示例

前提条件 创建django项目,安装配置过程这里就不讲述了。 后端url http://127.0.0.1:8000/echarts/demo/ view视图函数 from django.http import HttpResponse import jsondef EchartsDemo(request):data {}categories ["衬衫","羊毛衫",&…...

Java序列化、反序列化-为什么要使用序列化?Serializable接口的作用?

什么是序列化和反序列化? 把对象转换成字节序列把字节序列恢复成对象 结合OSI七层协议模型,序列化和反序列化是在那一层做的? 在OSI七层模型中,序列化工作的层级是表示层。这一层的主要功能包括把应用层的对象转换成一段连续的二进…...

连锁零售企业如何优化网络性能?

在传统的WAN网络中,分支机构通常通过专线或者MPLS连接到总部或数据中心,但这种连接受制于地理位置。而SD-WAN(Software-Defined Wide Area Network)这种创新的网络架构,它通过软件定义和虚拟化技术,将分支机…...

[已解决]HttpMessageNotReadableException: JSON parse error: Unexpected character:解析JSON时出现异常的问题分析与解决方案

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…...

华为OD机试 - 找数字(Java JS Python C)

题目描述 小扇和小船今天又玩起来了数字游戏, 小船给小扇一个正整数 n(1 ≤ n ≤ 1e9),小扇需要找到一个比 n 大的数字 m,使得 m 和 n 对应的二进制中 1 的个数要相同,如: 4对应二进制100 8对应二进制1000 其中1的个数都为1个 现在求 m 的最小值。 输入描述 输入一个…...

ElasticSearch - networking配置global

版本8.11 单机部署了一个节点 在elasticsearch.yml中 配置了network.host: 8.8.8.8(之前为127.0.0.1) 但启动服务失败 报错信息为: BindTransportException: Failed to bind to 8.8.8.8:[9300-9399] 为啥要配置8.8.8.8 是因为参考的官方说明 Networking | Elasticsearch Gu…...

GPT4停止订阅付费了怎么办? 怎么升级ChatGPT plus?提供解决方案

11月中旬日OpenAI 暂时关闭所有的升级入口之后,很多小伙伴就真的在排队等待哦。其实有方法可以绕开排队,直接付费订阅升级GPT的。赶紧用起来立马“插队”成功!亲测~~~ 一、登录ChatGPT账号 1、没有账号可以直接注册一个,流程超级…...

MySQL数据库,视图、存储过程与存储函数

数据库对象: 常见的数据库对象: 视图: 视图是一种虚拟表,本身是不具有数据的占用很少的内存空间。 视图建立在已有表的基础上,视图赖以建立的这些表称为基表。 视图的创建和删除只影响视图本身,不影响对…...

【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归

【【Pytorch】学习记录分享3——PyTorch 自动微分与线性回归 1. autograd 包,自动微分2. 线性模型回归演示3. GPU进行模型训练 小结:只需要将前向传播设置好,调用反向传播接口,即可实现反向传播的链式求导 1. autograd 包&#x…...

Android Studio实现俄罗斯方块

文章目录 一、项目概述二、开发环境三、详细设计3.1 CacheUtils类3.2 BlockAdapter类3.3 CommonAdapter类3.4 SelectActivity3.5 MainActivity 四、运行演示五、项目总结 一、项目概述 俄罗斯方块是一种经典的电子游戏,最早由俄罗斯人Alexey Pajitnov在1984年创建。…...

【Hive】——DDL(DATABASE)

1 概述 2 创建数据库 create database if not exists test_database comment "this is my first db" with dbproperties (createdByAllen);3 描述数据库信息 describe 可以简写为desc extended 可以展示更多信息 describe database test_database; describe databa…...

【华为OD题库-092】单词加密-java

题目 输入一个英文句子,句子中包含若干个单词,每个单词间有一个空格需要将句子中的每个单词按照要求加密输出。要求: 1)单词中包括元音字符(‘aeuio’、‘AEUIO’,大小写都算),则将元音字符替换成’*) 2)单词中不包括元音字符&…...

构建一个简单的 npm 验证项目

构建一个简单的 npm 验证项目 0. 背景1. 构建过程1-1. 创建项目并初始化1-2. 安装 mjs 支持的 package1-3. 在 package.json 中添加 mjs 脚本1-4. 创建 index.mjs 文件1-5. 执行脚本 2. (Optional)环境变量配置 0. 背景 工作上需要验证一下 npm 程序,所以需要构建一…...

利用vue-okr-tree实现飞书OKR对齐视图

vue-okr-tree-demo 因开发需求需要做一个类似飞书OKR对齐视图的功能,参考了两位大神的代码: 开源组件vue-okr-tree作者博客地址:http://t.csdnimg.cn/5gNfd 对组件二次封装的作者博客地址:http://t.csdnimg.cn/Tjaf0 开源组件v…...

持续集成交付CICD:CentOS 7 安装SaltStack

目录 一、理论 1.SaltStack 二、实验 1.主机一安装master 2.主机二安装第一台minion 3.主机三安装第二台minion 4.测试SaltStack 三、问题 1.CentOS 8 如何安装SaltStack 一、理论 1.SaltStack (1)概念 SaltStack是基于python开发的一套C/S自…...

vscode 环境配置

必备插件 配置调试 {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","confi…...

pytorch文本分类(二):引入pytorch处理文本数据

pytorch文本数据处理 目录 pytorch文本数据处理1. Pytorch背景2. 数据分割3. 数据加载Dataset代码分析字典的用途代码修改的目的 Dataloader 4. 练习 原学习任务链接 相关数据链接:https://pan.baidu.com/s/1iwE3LdRv3uAkGGI2fF9BjA?pwdro0v 提取码:ro…...