【Docker 内核详解】namespace 资源隔离(四):Mount namespace Network namespace
【Docker 内核详解 - namespace 资源隔离】系列包含:
- namespace 资源隔离(一):进行 namespace API 操作的 4 种方式
- namespace 资源隔离(二):UTS namespace & IPC namespace
- namespace 资源隔离(三):PID namespace
- namespace 资源隔离(四):Mount namespace & Network namespace
- namespace 资源隔离(五):User namespaces
namespace 资源隔离(四):Mount namespace & Network namespace
1.Mount namespace
mount namespace
通过隔离文件系统挂载点对隔离文件系统提供支持,它是历史上第一个 Linux namespace
,所以标识位比较特殊,就是 CLONE_NEWNS
。隔离后,不同 mount namespace
中的文件结构发生变化也互不影响。可以通过 /proc/[pid]/mounts
查看到所有挂载在当前 namespace
中的文件系统,还可以通过 /proc/[pid]/mountstats
看到 mount namespace
中文件设备的统计信息,包括挂载文件的名字、文件系统类型、挂载位置等。
进程在创建 mount namespace
时,会把当前的文件结构复制给新的 namespace
。新 namespace
中的所有 mount
操作都只影响自身的文件系统,对外界不会产生任何影响。这种做法非常严格地实现了隔离,但对某些情况可能并不适用。比如父节点 namespace
中的进程挂载了一张 CD-ROM,这时子节点 namespace
复制的目录结构是无法自动挂载上这张 CD-ROM 的,因为这种操作会影响到父节点的文件系统。
2006 年引入的 挂载传播(mount propagation
)解决了这个问题,挂载传播定义了 挂载对象(mount object
)之间的关系,这样的关系包括共享关系和从属关系,系统用这些关系决定任何挂载对象中的挂载事件如何传播到其他挂载对象。
- 共享关系(
share relationship
)。如果两个挂载对象具有共享关系,那么一个挂载对象中的挂载事件会传播到另一个挂载对象,反之亦然。 - 从属关系(
slave relationship
)。如果两个挂载对象形成从属关系,那么一个挂载对象中的挂载事件会传播到另一个挂载对象,但是反之不行;在这种关系中,从属对象是事件的接收者。
一个挂载状态可能为以下一种:
- 共享挂载(
share
):传播事件的挂载对象称为共享挂载。 - 从属挂载(
slave
):接收传播事件的挂载对象称为从属挂载。 - 共享 / 从属挂载(
shared and slave
):同时兼有前述两者特征的挂载对象称为共享 / 从属挂载。 - 私有挂载(
private
):既不传播也不接收传播事件的挂载对象称为私有挂载。 - 不可绑定挂载(
unbindable
):另一种特殊的挂载对象称为不可绑定的挂载,它们与私有挂载相似,但是不允许执行绑定挂载,即创建mount namespace
时这块文件对象不可被复制。
通过下图可以更好地了解它们的状态变化。
以上图为例说明常用的挂载传播方式。最上层的 mount namespace
下的 /bin
目录与 child namespace
通过 master slave
方式进行挂载传播,当 mount namespace
中的 /bin
目录发生变化时,发生的挂载事件能够自动传播到 child namespace
中;/lib
目录使用完全的共享挂载传播,各 namespace
之间发生的变化都会互相影响;/proc
目录使用私有挂载传播的方式,各 mount namespace
之间互相隔离;最后的 /root
目录一般都是管理员所有,不能让其他 mount namespace
挂载绑定。
默认情况下,所有挂载状态都是私有的。设置为共享挂载的命令如下。
mount --make-shared <mount-object>
从共享挂载状态的挂载对象克隆的挂载对象,其状态也是共享,它们相互传播挂载事件。设置为从属挂载的命令如下。
mount --make-slave <shared-mount-object>
来源于从属挂载对象克隆的挂载对象也是从属的挂载,它也从属于原来的从属挂载的主挂载对象。
将一个从属挂载对象设置为共享 / 从属挂载,可以执行如下命令,或者将其移动到一个共享挂载对象下。
mount --make-shared <slave-mount-obiect>
如果想把修改过的挂载对象重新标记为私有的,可以执行如下命令。
mount --make-private <mount-obiect>
通过执行以下命令,可以将挂载对象标记为不可绑定的。
mount --make-unbindable <mount-object>
这些设置都可以递归式地应用到所有子目录中,如果大家感兴趣可以自行搜索相关命令在代码中实现 mount namespace
隔离与其他 namespace
类似,加上 CLONE_NEWNS
标识位即可。让我们再次修改代码,并且另存为 mount.c
进行编译运行。
// [...]
int child pid = clone(child main, child stack + STACK_SIZE, CLONE_NEWNS | CLONE_NEWPID | CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD,NULL);
// [...]
CLONE_NEWNS
生效之后,子进程进行的挂载与卸载操作都将只作用于这个 mount namespace
,因此在上文中提到的处于单独 PID namespace
隔离中的进程在加上 mount namespace
的隔离之后,即使该进程重新挂载了 /proc
文件系统,当进程退出后,root mountnamespace
(主机)的 /proc
文件系统是不会被破坏的。
2.Network namespace
当我们了解完各类 namespace
,兴致勃勃地构建出一个容器,并在容器中启动一个 Apache 进程时,却出现了 “80 端口已被占用” 的错误,原来主机上已经运行了一个 Apache 进程,这时就需要借助 network namespace
技术进行网络隔离。
network namespace
主要提供了关于网络资源的隔离,包括网络设备、IPv4 和 IPv6 协议栈、IP 路由表、防火墙、/proc/net
目录、/sys/class/net
目录、套接字(socket
)等。一个物理的网络设备最多存在于一个 network namespace
中,可以通过创建 veth pair
(虚拟网络设备对:有两端,类似管道,如果数据从一端传入,另一端也能接收到,反之亦然)在不同的 network namespace
间创建通道,以达到通信目的。
veth
是Virtual Ethernet Device
的缩写,是一种成对出现的 Linux 虚拟网络接口设备。它最常用的功能是用于将不同的 Linux network namespaces 命名空间网络连接起来,让两个 namespaces 之间可以进行通信。我们可以简单的把veth pair
理解为用一根网线,把两台电脑(两个 namespaces)连接起来。这样我们就很好理解,veth pair
的任何一端 down 掉了,另外一端也就 down 掉了。
一般情况下,物理网络设备都分配在最初的 root namespace
(表示系统默认的 namespace
)中。但是如果有多块物理网卡,也可以把其中一块或多块分配给新创建的 network namespace
。需要注意的是,当新创建的 network namespace
被释放时(所有内部的进程都终止,并且 namespace
文件没有被挂载或打开),在这个 namespace
中的物理网卡会返回到 root namespace
,而非创建该进程的父进程所在的 network namespace
。
当说到 network namespace
时,指的未必是真正的网络隔离,而是把网络独立出来,给外部用户一种透明的感觉,仿佛在与一个独立网络实体进行通信。为了达到该目的,容器的经典做法就是创建一个 veth pair
,一端放置在新的 namespace
中,通常命名为 eth0
,一端放在原先的 namespace
中连接物理网络设备,再通过把多个设备接入网桥或者进行路由转发,来实现通信的目的。
也许大家会好奇,在建立起 veth pair
之前,新旧 namespace
该如何通信呢?答案是 pipe
(管道)。以 Docker daemon 启动容器的过程为例,假设容器内初始化的进程称为 init
。Docker daemon 在宿主机上负责创建这个 veth pair
,把一端绑定到 docker0
网桥上,另一端接入新建的 network namespace
进程中。这个过程执行期间,Docker daemon 和 init
就通过 pipe
进行通信。具体来说,就是在 Docker daemon 完成 veth pair
的创建之前,init
在管道的另一端循环等待,直到管道另一端传来 Docker daemon 关于 veth
设备的信息,并关闭管道。init
才结束等待的过程,并把它的 eth0
启动起来。整个结构如下图所示。
与其他 namespace
类似,对 network namespace
的使用其实就是在创建的时候添加 CLONE_NEWNET
标识位。后续博客将会对 Docker 网络进行详细介绍,此处不再赘述。
相关文章:
【Docker 内核详解】namespace 资源隔离(四):Mount namespace Network namespace
【Docker 内核详解 - namespace 资源隔离】系列包含: namespace 资源隔离(一):进行 namespace API 操作的 4 种方式namespace 资源隔离(二):UTS namespace & IPC namespacenamespace 资源隔…...
STM32简介
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器,常应用在嵌入式领域如: 智能车(用stm32做寻迹小车,读取光电传感器或者摄像头数据,然后驱动电机前进和转弯); 无人机(用stm3…...
Yum安装JDK11
一、安装命令 : yum install java-11-openjdk二、执行以下命令来查看 JDK 11 的安装信息: yum list installed | grep java-11-openjdk三、找到 JDK 11 的软件包名称(使用以下命令来查询软件包的安装位置): rpm -ql…...
[HNCTF 2022 WEEK2]ez_ssrf题目解析
这题主要是引入ssrf这个漏洞攻击,本质上没有更深入的考察 本题是需要我们去伪造一个ssrf的请求头去绕过 题目开始给了我们信息让我们去访问index.php fsockopen函数触发ssrf fsockopen() 函数建立与指定主机和端口的 socket 连接。然后,它将传入的 bas…...
OpenFOAM: twoPhaseEulerFoam解读
twoPhaseEulerFoam全解读之一(转载) 本系列将对OpenFOAM-2.1.1 中的 twoPhaseEulerFoam 求解器进行完全解读,共分三部分:方程推导,代码解读,补充说明。本篇进行方程推导,详细介绍如果从双流体模型出发得到 twoPhaseEu…...
ffmpeg跨平台arm编译-ubuntu
目录 1. 安装必要的编译器2. 安装必要的依赖项3. 配置编译选项4. 编译安装 1. 安装必要的编译器 32位系统: sudo apt-get update sudo apt-get install gcc-arm-linux-gnueabihf sudo apt-get install g-arm-linux-gnueabihf64位系统: sudo apt-get u…...
Vue 网络处理 - axios 异步请求的使用,请求响应拦截器
目录 一、axiox 1.1、axios 简介 1.2、axios 基本使用 1.2.1、下载核心 js 文件. 1.2.2、发送 GET 异步请求 1.2.3、发送 POST 异步请求 1.2.4、发送 GET、POST 请求最佳实践 1.3、请求响应拦截器 1.3.1、拦截器解释 1.3.2、请求拦截器的使用 1.3.3、响应拦截器的使用…...
单目3D目标检测——MonoDLE 模型训练 | 模型推理
本文分享 MonoDLE 的模型训练、模型推理、可视化3D检测结果。 模型原理,参考我这篇博客:【论文解读】单目3D目标检测 MonoDLE(CVPR2021)_一颗小树x的博客-CSDN博客 源码地址:https://github.com/xinzhuma/monodle 目…...
CSS悬停卡片翻转明信片效果源码附注释
运行效果演示: HTML页面代码: <!DOCTYPE html> <html lang="en" > <head>...
使用kaliber与imu_utils进行IMU、相机+IMU联合标定
目录 1 标定工具编译 1.1 IMU标定工具 imu_utils 1.2 相机标定工具 kaliber 2 标定数据录制 3 开始标定 3.1 IMU标定 3.2 相机标定 3.3 相机IMU联合标定 4 将参数填入ORBSLAM的文件中 1 标定工具编译 1.1 IMU标定工具 imu_utils 标定IMU我们使用imu_utils软件进行标定…...
统一观测丨使用 Prometheus 监控 SQL Server 最佳实践
作者:啃唯 SQL Server 简介 SQL Server 是什么? Microsoft SQL Server 是 Microsoft 推出的关系型数据库解决方案,支持企业 IT 环境中的各种事务处理、商业智能和分析应用程序。Microsoft SQL Server 是市场领先的数据库技术之一。 SQL S…...
最短无序连续子数组
题目链接 最短无序连续子数组 题目描述 注意点 找出符合题意的 最短 子数组,并输出它的长度-100000 < nums[i] < 100000 解答思路 本题的数组可以分为三段,左段中段和右段,如下图所示 观察规律可知,左段元素始终比中段…...
更新 | 持续开源迅为RK3568驱动指南第十二篇-GPIO子系统
《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十二期_GPIO子系统-全新升级)视频,后续资料会不断更新,不断完善,帮助用户快速入门,大大提升研发速度。 文档教程更新至第十…...
centos7安装erlang23.3.4.11及rabbitmq3.9.16版本
rpm包有系统版本要求,el是Red Hat Enterprise Linux(EL)的缩写。 EL7是Red Hat 7.x,Centos 7.x EL8是Red Hat 8.x, Centos 8.x 所以我们在安装erlang及rabbitmq时需要选择与自己的服务器相对应的rpm包 # rabbitmq的rpm安装包 https://github.com/rabbi…...
VMware和Debian下载
文章目录 ⭐️写在前面的话⭐️一、VMware二、Debain三、建立虚拟机🚀 先看后赞,养成习惯!🚀🚀 先看后赞,养成习惯!🚀 ⭐️写在前面的话⭐️ CSDN主页:程序员好冰 目前在…...
mysql面试题48:MySQL中 Innodb的事务与日志的实现方式
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官: Innodb的事务与日志的实现方式 以下是InnoDB事务和日志的实现方式的详细说明: 事务日志(Transaction Log): InnoDB使用事务日志来保证事务的…...
数据结构 优先级队列(堆)
数据结构 优先级队列(堆) 文章目录 数据结构 优先级队列(堆)1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1 堆向下调整2.3.2 堆的创建2.3.3 建堆的时间复杂度 2.4 堆的插入与删除2.4.1 堆的插入2.4.2 堆的删除 2.5 用堆模拟实现…...
如何在edge浏览器中给PDF添加文字批注
我用的edge浏览器是目前最新版的(一般自动更新到最新版) 最近,我喜欢用edge浏览器查看PDF,节省电脑资源,快捷且方便。 但edge对PDF的标注种类较少,主要是划线和涂色,文字批注功能尚未出现在工具…...
集成学习的小九九
集成学习(Ensemble Learning)是一种机器学习的方法,通过结合多个基本模型的预测结果来进行决策或预测。集成学习的目标是通过组合多个模型的优势,并弥补单个模型的不足,从而提高整体性能。 集成学习的主要策略 在集成…...
深入理解Scrapy
Scrapy是什么 An open source and collaborative framework for extracting the data you need from websites. In a fast, simple, yet extensible way. Scrapy是适用于Python的一个快速、简单、功能强大的web爬虫框架,通常用于抓取web站点并从页面中提取结构化的数…...
想做WMS仓库管理系统,找了好久才找到云表
公司内部仓库管理原方式均基于人工电子表格管理方式来实现收发存管理,没有流程化管理,无法保证数据的准确性和及时性,同时现场操作和数据核对会出现不同步的情况,无法提高仓库的运作效率,因此,我们基于云表…...
公司销售个人号如何管理?
微信管理系统可以帮助企业解决哪些问题呢? 一、解决聊天记录监管问题 1.聊天记录的保存,让公司的管理者可以随时查看公司任意销售与客户的聊天记录,不用一个一个员工逐一去看,方便管理; 2.敏感词监控,管理者…...
COLE HERSEE 48408 工业4.0、制造业X和元宇宙
COLE HERSEE 48408 工业4.0、制造业X和元宇宙 需要数据来释放工业4.0的全部潜力——价值链中的所有公司都可以访问大量数据。一个新的互联数据生态系统旨在提供解决方案:制造业x。 在德国联邦经济事务和气候行动部以及BDI、VDMA和ZVEI贸易协会的密切合作下,实施制…...
【Vue基础-数字大屏】加载动漫效果
一、需求描述 当网页正在加载而处于空白页面状态时,可以在该页面上显示加载动画提示。 二、步骤代码 1、全局下载npm install -g json-server npm install -g json-server 2、在src目录下新建文件夹mock,新建文件data.json存放模拟数据 {"one&…...
CSS 样式简写
在CSS中有许多简写的样式,它们被广泛使用。简写最好按照如下顺序进行书写 font font: font-style font-weight font-size/line-height font-familyfont-style italic//斜体 normal//正常字体(默认)font-weight 一般填写数字 400 normal(默认值) 700 bold(默认值)f…...
SQL Server创建数据库
简单创建写法 默认初始大小为5MB,增长速度为2MB create database DBTEST自定义 用户创建的数据库都被存放在sys.database中,每个数据库在表中占一行,name字段存放的数据库的名称,具体字段可以看此博客sys.database系统表详细说明 所以判断…...
树莓派安装.NET 6.0
首先安装.Net Core依赖(未使用) sudo apt install -y libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev libcurl4 libcurl4-openssl-dev libssl-dev uuid-dev unzip libgdiplus libc6-dev libkrb5-3 需要安装的依赖微软官方文档已经列出…...
小华HC32F448串口使用
目录 1. 串口GPIO配置 2. 串口波特率配置 3. 串口接收超时配置 4. 串口中断注册 5. 串口初始化 6. 串口数据接收处理 7. DMA接收配置和处理 1. 串口GPIO配置 端口号和Pin脚号跟STM32没什么区别。 串口复用功能跟STM32大不一样。 如下图,选自HC32F448 表 2…...
Redis实现简易消息队列的三种方式
Redis实现简易消息队列的三种方式 消息队列简介 消息队列是一种用于在计算机系统中传递和处理数据的重要工具。如果你完全不了解消息队列,不用担心,我将尽力以简单明了的方式来解释它。 首先,想象一下你正在玩一个游戏,而游戏中…...
基于SpringBoot的在线小说阅读平台系统
基于SpringBoot的在线小说阅读平台系统的设计与实现~ 开发语言:Java数据库:MySQL技术:SpringBootMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 登录界面 管理员界面 摘要 基于Spring Boot的在线小说阅读…...
怎么给网站做动图/北京seo网络推广
疫情期间,大多数学子的毕业季都很苦涩,除了求职难,很多同学们甚至无法认真告别,有些同学这次见不到,也许一生都不再见。百度也见证了一场别开生面的“云毕业”,这些同学们来自百度飞桨官方出品的《百度架构…...
做社区生意的网站/百度推广app下载
1、测试和生产共用一套zookeeper,怎么保证消费不冲突 ? 方案1、服务发布的group设置为不同; <dubbo:reference id"comm1" timeout"100000" interface"com.acq.facade.CommService" group"comm102&qu…...
网站色彩代码/谷歌广告平台
基础篇 面向对象Java基础知识Java并发编程 进阶篇 Java底层知识设计模式网络编程知识框架知识应用服务器知识工具 高级篇 性能优化线上问题分析编译原理知识操作系统知识数据库知识数据结构与算法知识大数据知识网络安全知识 底层篇 JVMJava内存模型虚拟机性能监控与故障处…...
东营今日新闻/邯郸seo优化
毫无疑问,AI(人工智能)已成为了科技巨头保持领先、开拓新机会的核心要素之一。目前,无论是巨头还是创业公司都在积极理解AI,那马化腾先生是如何看待AI领域目前的发展? 为什么要关注AI 去年AlphaGo打赢了人类…...
勉费申请做网站/关键词搜索神器
关于Spring中基于xml文件配置bean的详细总结(spring 4.1.0) 一、Spring中的依赖注入方式介绍 依赖注入有三种方式 属性注入构造方法注入工厂方法注入(很少使用,不推荐,本文不再介绍)属性注入 通过 setter…...
珠海网站建设方案开发/汽车宣传软文
参考链接: pytorch创建data.DataLoader时,参数pin_memory的理解 参考链接: What is the disadvantage of using pin_memory? 参考链接: 【pytorch】torch.utils.data.DataLoader中的pin_memory属性 pin_memory就是锁页内存,创建DataLoader时࿰…...