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

相关文章

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp