Docker 容器资源隔离 namespace(十)
目录
一、简介
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。不知道你是否还记得很早以前的 Unix 有一个叫 chroot 的系统调用(通过修改根目录把用户 jail 到一个特定目录下),chroot 提供了一种简单的隔离模式:chroot 内部的文件系统无法访问外部的内容。Linux Namespace 在此基础上,提供了对 UTS、IPC、mount、PID、network、User 等的隔离机制。
举个例子,我们都知道,Linux 下的超级父亲进程的PID是1,所以,同 chroot 一样,如果我们可以把用户的进程空间 jail 到某个进程分支下,并像 chroot 那样让其下面的进程 看到的那个超级父进程的 PID 为1,于是就可以达到资源隔离的效果了(不同的 PID namespace 中的进程无法看到彼此)
Linux Namespace的6大类型
类型 | 功能说明 |
---|---|
Mount Namespace | 提供磁盘挂载点和文件系统的隔离能力 |
IPC Namespace | 提供进程间通信的隔离能力 |
Network Namespace | 提供网络隔离能力 |
UTS Namespace | 提供主机名隔离能力 |
PID Namespace | 提供进程隔离能力 |
User Namespace | 提供用户隔离能力 |
二、Mount Namespace
Mount namespace 让容器看上去拥有整个文件系统。
容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
三、IPC Namespace
IPC 全称 Inter-Process Communication,是 Unix/Linux 下进程间通信的一种方式,IPC 有共享内存、信号量、消息队列等方法。所以,为了隔离,我们也需要把IPC给隔离开来,这样,只有在同一个 Namespace 下的进程才能相互通信。IPC 需要有一个全局的 ID,即然是全局的,那么就意味着我们的 Namespace 需要对这个 ID 隔离,不能让别的 Namespace 的进程看到。
四、Network Namespace
Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。
五、UTS Namespace
简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。
六、PID Namespace
容器在 host 中以进程的形式运行。例如当前 host 中运行了一个容器:
通过 ps axf 可以查看容器进程:
所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。 如果我们进入到某个容器,ps 就只能看到自己的进程了。
而且进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的 init 进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。
七、User Namespace
User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
最新文章
- 新手学跨域之iframe
- 嵌入式Linux的调试技术
- 【BZOJ】2595: [Wc2008]游览计划
- 向Oracle中传入数组,批量执行SQL语句
- Temporary Segments: What Happens When a Sort Occurs (文档 ID 102339.1)
- 开源堡垒机GateOne的安装、配置笔记
- 《WPF程序设计指南》读书笔记——第4章 按钮与其他控件
- 从源码分析java.lang.String.isEmpty()
- Python实战之字符串的详细简单练习
- [SCOI2007]最大土地面积
- DirectX--给视频加马赛克、字符OSD
- 【NOI2019模拟】搬砖
- jmeter(五)JDBC Request
- 编译安装openssl
- Python3学习笔记26-unittest模块
- composer卸载重装
- 2017-4-18/缓存、CDN
- Python 给实例或者类动态绑定属性和方法
- mysql数据库导出CSV乱码问题
- blob下载出现多余乱码内容
热门文章
- volatile相关知识
- 关于LinkedList for OpenJDK
- [Angular 8] Lazy loading with dynamic loading syntax
- Spring动态代理及Spring Bean的生命周期
- Python的模块,模块的使用、安装,别名,模块作用域
- NetworkX系列教程(10)-算法之二:最小/大生成树问题
- gcc/g++ 链接库的编译与链接
- 前端武器库之jQuery示例
- (转)supervisor
- python3编程基础之一:注释模块和包