【Docker 内核详解】namespace 资源隔离(二):UTS namespace IPC namespace
namespace 资源隔离(二):UTS namespace & IPC namespace
1.UTS namespace
UTS
(UNIX Time-sharing System
),UTS namespace
提供了 主机名 和 域名 的隔离,这样每个 Docker 容器就可以拥有独立的主机名和域名了,在网络上可以被视作一个独立的节点,而非宿主机上的一个进程。Docker 中,每个镜像基本都以自身所提供的服务名称来命名镜像的 hostname
,且不会对宿主机产生任何影响,其原理就是利用了 UTS namespace
。
下面通过代码来感受一下 UTS 隔离的效果,首先需要一个程序的骨架。打开编辑器创建 uts.c
文件,输入如下代码。
#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>#define STACK_SIZE (1024 * 1024)static char child_stack[STACK_SIZE];
char* const child_args[] = {"/bin/bash",NULL
};int child_main(void* args){printf("在子进程中!\n");execv(child_args[0], child_args);return 1;
}int main(){printf("程序开始:\n");int child_pid = clone(child_main, child_stack + STACK_SIZE, SIGCHLD, NULL);waitpid(child_pid, NULL, 0);printf("已退出\n");return 0;
}
编译并运行上述代码,执行如下命令,效果如下。
-Wall
是 GCC 编译器的一个编译选项,它会开启编译器的所有警告选项。当开启 -Wall
选项后,编译器会对代码中可能存在的潜在问题发出警告,例如未使用变量、变量未初始化、类型转换等。这样可以让开发者更好地发现潜在的问题并进行修复。
root@local:~# gcc -Wall uts.c -o uts.o && ./uts.o
程序开始:
在子进程中!
root@local:~# exit
exit
已退出
root@local:~#
下面将修改代码,加入 UTS 隔离。运行代码需要 root
权限,以防止普通用户任意修改系统主机名导致 set-user-ID
相关的应用运行出错。
// [...]
int child_main(void* arg) {printf("在子进程中!\n");sethostname("NewNamespace", 12);execv(child_args[0], child_args);return 1;
}int main(){//[...]int child_pid = clone(child_main, child_stack + STACK_SIZE, CLONE_NEWUTS | SIGCHLD, NULL);//[...]
}
再次运行,可以看到 hostname
已经变化。
root@local:~# gcc -Wall namespace.c -o main.o && ./main.o
程序开始:
在子进程中!
root@NewNamespace:~# exit
exit
已退出
root@local:~# <-- 回到原来的hostname
值得一提的是,也许有读者会尝试不加 CLONE_NEWUTS
参数运行上述代码,发现主机名同样改变了,并且输入 exit
后主机名也恢复了,似乎并没有区别。实际上,不加 CLONE_NEWUTS
参数进行隔离时,由于使用 sethostname
函数,所以宿主机的主机名被修改了。而看到 exit
退出后主机名还原,是因为 bash 只在刚登录时读取一次 UTS,不会实时读取最新的主机名。当重新登录或者使用 uname
命令进行查看时,就会发现产生的变化。
2.IPC namespace
进程间通信(Inter-Process Communication
,IPC
)涉及的 IPC 资源包括常见的 信号量、消息队列 和 共享内存。申请 IPC 资源就申请了一个全局唯一的 32 32 32 位 ID,所以 IPC namespace
中实际上包含了 系统 IPC 标识符 以及 实现 POSIX 消息队列的文件系统。在同一个 IPC namespace
下的进程彼此可见,不同 IPC namespace
下的进程则互相不可见。
IPC namespace
在实现代码上与 UTS namespace
相似,只是标识位有所变化,需要加上 CLONE_NEWIPC
参数。主要改动如下,其他部分不变,程序名称改为 ipc.c
。
// [...]
int child_pid = clone(child_main, child_stack + STACK_SIZE, CLONE_NEWIPC | CLONE_NEWUTS | SIGCHLD, NULL);
// [...]
首先在 shell 中使用 ipcmk -Q
命令创建一个 message queue
。
root@local:~# ipcmk-Q
Message queue id: 32769
通过 ipcs- q
可以查看到已经开启的 message queue
,序号为 32769 32769 32769。
root@local:~# ipcs -q
------ Message Queues ----
key msqid owner perms used-bytes messages
0x4cf5e29f 32769 root 644 0 0
然后可以编译运行加入了 IPC namespace
隔离的 ipc.c
,在新建的子进程中调用的 shell 中执行 ipcs -q
查看 message queue
。
root@local:~# gcc -wall ipc.c -o ipc.o && ./ipc.o
程序开始:
在子进程中!
root@NewNamespace:~# ipcs -q
------ Message Queues ------
key msqid owner perms used-bytes messages
root@NewNamespace:~# exit
exit
已退出
从结果显示中可以发现,子进程找不到原先声明的 message queue
了,已经实现了 IPC 的隔离。
目前使用 IPC namespace
机制的系统不多,其中比较有名的有 PostgreSQL。Docker 当前也使用 IPC namespace
实现了容器与宿主机、容器与容器之间的 IPC 隔离。
相关文章:
【Docker 内核详解】namespace 资源隔离(二):UTS namespace IPC namespace
namespace 资源隔离(二):UTS namespace & IPC namespace 1.UTS namespace UTS(UNIX Time-sharing System),UTS namespace 提供了 主机名 和 域名 的隔离,这样每个 Docker 容器就可以拥有独…...

EOF() | BOF()相关题目解析
题目 设当前数据库有10条记录(记录未进行任何索引),在下列3种情况下,当前记录号为1时:EOF()为真时;BOF()为真时,命令RECN()的结果分别是______。 A.1,11,1B.1,10,1C.1,11,0D…...

spring 注入 当有两个参数的时候 接上面
新加一个int 型的 age 记得写getset方法和构造方法 ((((((( 构造方法的作用——无论是有参构造还是无参构造,他的作用都是为了方便为对象的属性初始化值 构造方法是一种特殊的方…...

博客文档续更
十、 博客前台模块-异常处理 目前我们的项目在认证出错或者权限不足的时候响应回来的Json,默认是使用Security官方提供的响应的格式,但是这种响应的格式肯定是不符合我们项目的接口规范的。所以需要自定义异常处理 我们需要去实现AuthenticationEntryP…...

OCR让点读笔如虎添翼
点读笔是一种智能学习工具,它可以通过识别文字来提供相应的语音或图像反馈。在实现文字识别功能时,点读笔通常会借助OCR(Optical Character Recognition,光学字符识别)技术。下面将详细介绍点读笔如何利用OCR技术实现文…...

棱镜七彩参编!开源领域4项团体标准正式发布
近日,中电标2023年第27号团体标准公告正式发布,《T/CESA 1270.2-2023 信息技术 开源治理 第 2 部分:企业治理评估模型》、《T/CESA 1270.3-2023 信息技术 开源治理 第 3 部分:社区治理框架》、《T/CESA 1270.5-2023 信息技术 开源…...

轻量级Composition
MEF,全称Managed Extensibility Framework(托管可扩展框架)。MEF是专门致力于解决扩展性问题的框架。MEF 位于 ComponentModel.Composition 程序集中,添加 System.ComponentModel.Composition 和 System.ComponentModel.Compositi…...
Vxlan网络和flannel记录
Vxlan 大二层网络,在三层网络中构建逻辑的2层网络 数据包经过vxlan隧道 用vni标识不同的vxlan网络(类似于vlan的vid) 通过vtep来封装和解封装,通过UDP传输 Flannel 分配子网和IP地址:Flannel为每个容器或虚拟机分配唯一…...
【已解决】微信小程序-苹果手机日期解析异常
在开发微信小程序时,使用了 uView 的 CountDown倒计时 组件和 uni.$u.timeFrom Api,后台传递了一个时间字符串,前台计算时间戳的差值,来显示还有多久开始,这个功能在模拟器和我自己手机(iphon13)…...

Avalonia如何更改全局背景色
1.项目下载地址:https://gitee.com/confusedkitten/avalonia-demo 2.UI库Semi.Avalonia,项目地址 https://github.com/irihitech/Semi.Avalonia 3.ColorView,使用Semi.Avalonia.ColorPicker,Nuget获取就行 4.样式预览 以下是…...
万界星空科技低代码平台云MES系统功能场景
1、 工艺管理 生产工艺规程、岗位操作法、工艺卡片的编制。 生产过程的工艺条件、产品质量指标以及原材料消耗的执行检查、相关数据的统计分析。 2、 工序管理 对人、机、料、法控制,规定产品质量标准及有关完成方法的各项规程,并明确各道工序的管理负责…...

运维大数据平台的建设与实践探索
随着企业数字化转型的推进,运维管理面临着前所未有的挑战和机遇。为应对日益复杂且严峻的挑战,数字免疫系统和智能运维等概念应运而生。数字免疫系统和智能运维作为新兴技术,正引领着运维管理的新趋势。数字免疫系统和智能运维都借助大数据运…...

【Java 进阶篇】创建 HTML 注册页面
在这篇博客中,我们将介绍如何创建一个简单的 HTML 注册页面。HTML(Hypertext Markup Language)是一种标记语言,用于构建网页的结构和内容。创建一个注册页面是网页开发的常见任务之一,它允许用户提供个人信息并注册成为…...

【JVM系列】- 启航·JVM概论学习
启航JVM概论 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正,…...

Windows技巧
Windows应用 Windows应用无限延长Windows10 自动更新时间管理员身份打开cmd输入以下代码设置暂停更新时间 Windows应用 无限延长Windows10 自动更新时间 管理员身份打开cmd 输入以下代码 这里设置的是3000天,需要恢复更新可以将其设置为1天 reg add “HKEY_LOCA…...
Git 应用小记
常用命令 git reset 3种模式 --soft:将HEAD引用指向给定提交,索引(暂存区)和工作目录的内容不变 --mixed(默认,可不写):将HEAD引用指向给定提交,索引(暂存区…...
APT攻击与零日漏洞
APT攻击 当谈到网络安全时,APT(高级持续性威胁)攻击是最为复杂和难以检测的攻击类型之一。APT攻击通常涉及到高度的技术和策略性,而且它们的目标是深入地渗透和长时间地隐藏在目标网络中。 1. 什么是APT攻击? 高级持续…...

leetCode 1143.最长公共子序列 动态规划 + 滚动数组
1143. 最长公共子序列 - 力扣(LeetCode) 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串…...
【C++ Miscellany】继承体系非尾端类设计为抽象类
部分赋值问题 用软件来处理两种动物:蜥蜴和鸡 class Animal { public:Animal& operator (const Animal& rhs);... };class Lizard: public Animal { public:Lizard& operator (const Lizard& rhs);... };class Chicken: public Animal {Chicken…...

Leetcode236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

Java后端检查空条件查询
通过抛出运行异常:throw new RuntimeException("请输入查询条件!");BranchWarehouseServiceImpl.java // 查询试剂交易(入库/出库)记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...
大模型真的像人一样“思考”和“理解”吗?
Yann LeCun 新研究的核心探讨:大语言模型(LLM)的“理解”和“思考”方式与人类认知的根本差异。 核心问题:大模型真的像人一样“思考”和“理解”吗? 人类的思考方式: 你的大脑是个超级整理师。面对海量信…...