【Docker 内核详解】namespace 资源隔离(二):UTS namespace IPC namespace

2023-10-13 00:20

本文主要是介绍【Docker 内核详解】namespace 资源隔离(二):UTS namespace IPC namespace,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

namespace 资源隔离(二):UTS namespace & IPC namespace

1.UTS namespace

UTSUNIX 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 CommunicationIPC)涉及的 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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/199463

相关文章

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML