Docker背后的内核技术(一)——Namespace 资源隔离

2024-05-04 08:38

本文主要是介绍Docker背后的内核技术(一)——Namespace 资源隔离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:本文分析基于3.10.0-693.el7内核版本,即CentOS 7.4

背景

容器技术的产生主要依赖于Linux内核的两大技术,Namespace和Cgroup,也就是资源隔离和资源限制。这两种技术都可以单独使用,但是把它们放到一起后,实现的功能更为强大。我们今天就来了解了解Namespace技术。

Namespace种类

目前,内核中实现了6中Namespace:

Namespace作用
UTS隔离主机名和域名
IPC隔离信号量、消息队列
PID隔离进程编号
Network隔离网络设备、协议栈、端口
Mount隔离文件系统
User隔离用户和用户组

体验Namespace

对于Namespace的操作,主要通过clone()、setns()和unshare()这三个系统调用来实现,也就是Namespace的创建、加入和删除操作。

A、创建
由上我们知道有六种Namespace,因此对应到clone上,也有六个标志位与此对应。

Namespaceclone标志
UTSCLONE_NEWUTS
IPCCLONE_NEWIPC
PIDCLONE_NEWPID
NetworkCLONE_NEWNET
MountCLONE_NEWNS
UserCLONE_NEWUSER

在使用clone前我们先了解一下clone函数的入参,

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

其中,
child_func:表示子进程运行的主函数
child_stack:子进程使用的栈空间
flags:表示使用哪些 CLONE标志位
args:可用于传入用户参数

接下来我们以UTS隔离为例,看下效果。创建namespace.c,输入以下代码。

#define _GNU_SOURCE
#include <sys/wait.h>
#include <sys/utsname.h>
#include <sched.h>
#include <stdio.h>#define STACK_SIZE (1024 * 1024)
#define FLAGS SIGCHLD|CLONE_NEWUTS
static char stack[STACK_SIZE];
static char * const child_args[] = {"/bin/bash", NULL };static int child(void *arg)
{execv("/bin/bash", child_args);return 0;
}int main(int argc, char *argv[])
{pid_t pid;pid = clone(child, stack+STACK_SIZE, FLAGS, NULL);waitpid(pid, NULL, 0);return 0;
}

该代码运行后会新创建一个bash交互窗口,类似于在终端输入bash命令。
使用以下命令编译,

gcc namespace.c -o namespace

然后我们运行namespace,并进行修改hostname的操作,

[root@CentOS-7-4 /home/namespace]# ls
.  ..  namespace  namespace.c
[root@CentOS-7-4 /home/namespace]# hostname
CentOS-7-4
[root@CentOS-7-4 /home/namespace]# ./namespace 
[root@CentOS-7-4 /home/namespace]# hostname
CentOS-7-4
[root@CentOS-7-4 /home/namespace]# hostname newname
[root@CentOS-7-4 /home/namespace]# hostname
newname
[root@CentOS-7-4 /home/namespace]# exit
exit
[root@CentOS-7-4 /home/namespace]# hostname
CentOS-7-4

可见,通过UTS隔离后,我们进入新的终端修改主机名成功后,返回原先终端,修改的主机名并没有影响到原先的主机,因此达到了主机名的隔离效果。

我们再看下IPC的隔离效果,在上面代码的基础上,将FLAGS变量定义如下:

#define FLAGS SIGCHLD|CLONE_NEWUTS|CLONE_NEWIPC

同样进行编译,然后执行创建消息队列操作,

[root@CentOS-7-4 /home/namespace]# ./namespace 
[root@CentOS-7-4 /home/namespace]# ipcmk -Q
Message queue id: 0
[root@CentOS-7-4 /home/namespace]# ipcs -q------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x217cc434 0          root       644        0            0           [root@CentOS-7-4 /home/namespace]# exit
exit
[root@CentOS-7-4 /home/namespace]# ipcs -q------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages 

我们在新终端创建一个消息队列,但是在host上却看不到任何消息队列,因此IPC的隔离达到了效果。

其他的隔离也都可以通过相应的标志位由clone创建,就不再一一测试了。

这篇关于Docker背后的内核技术(一)——Namespace 资源隔离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

MySQL中的事务隔离级别详解

《MySQL中的事务隔离级别详解》在MySQL中,事务(Transaction)是一个执行单元,它要么完全执行,要么完全回滚,以保证数据的完整性和一致性,下面给大家介绍MySQL中的事务隔离级别详解,... 目录一、事务并发问题二、mysql 事务隔离级别1. READ UNCOMMITTED(读未提交)2

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

MySQL中隔离级别的使用详解

《MySQL中隔离级别的使用详解》:本文主要介绍MySQL中隔离级别的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言undo log的作用MVCC的实现有以下几个重要因素如何根据这些因素判断数据值?可重复读和已提交读区别?串行化隔离级别的实现幻读和可

debian12安装docker的实现步骤

《debian12安装docker的实现步骤》本文主要介绍了debian12安装docker的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录步骤 1:更新你的系统步骤 2:安装依赖项步骤 3:添加 docker 的官方 GPG 密钥步骤

快速修复一个Panic的Linux内核的技巧

《快速修复一个Panic的Linux内核的技巧》Linux系统中运行了不当的mkinitcpio操作导致内核文件不能正常工作,重启的时候,内核启动中止于Panic状态,该怎么解决这个问题呢?下面我们就... 感谢China编程(www.chinasem.cn)网友 鸢一雨音 的投稿写这篇文章是有原因的。为了配置完

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

Linux内核参数配置与验证详细指南

《Linux内核参数配置与验证详细指南》在Linux系统运维和性能优化中,内核参数(sysctl)的配置至关重要,本文主要来聊聊如何配置与验证这些Linux内核参数,希望对大家有一定的帮助... 目录1. 引言2. 内核参数的作用3. 如何设置内核参数3.1 临时设置(重启失效)3.2 永久设置(重启仍生效