Docker Notes-namespace
时间:2022-06-05
本文章向大家介绍Docker Notes-namespace,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
摘要: Docker Notes系列为学习Docker笔记,本文是学习namespace 资源隔离的笔记
正文:
对于开发者而言,Docker的大热让人们思考容器隔离的实现,如对主机名与域名的隔离、资源隔离、网络的隔离、进程间通信的隔离、用户权限的隔离、PID的隔离等。Linux内核中提供了以下6种namespace隔离的系统调用
namespace |
系统调用参数 |
隔离内容 |
---|---|---|
UTS |
CLONE_NEWUTC |
主机名与域名 |
IPC |
CLONE_NEWIPC |
信号量、消息队列、共享内存 |
PID |
CLONE_NEWPID |
进程编号 |
Network |
CLONE_NEWNET |
网络栈、端口 |
Mount |
CLONE_NEWNS |
文件系统 |
User |
CLONE_NEWUSER |
用户与用户组 |
-
namespace api
创建一个namespace一般使用clone()来创建,其API还包括setns()、unshare()、/proc目录下的一些文件
然后通过不同的参数来确定使用哪种隔离方式
-
clone()
clone()
是fork()
的一种变种,fork()
是一种创建自身进程副本的操作,clone()可以通过flags参数来控制使用多少功能 fork()在父进程中返回新创建子进程的进程ID,在子进程中返回0,出现错误返回负值 - setns() 在使用Docker exec在运行的容器中执行一个新的命令就需要该方法,进程从原来的namespace加入到另一个namespace,通常会在setns()执行后使用clone()创建子进程继续执行命令,让原进程结束运行 加入namespace后可以通过引入execve()函数执行用户命令(调用/bin/bash 接收参数,运行起一个shell)
- unshare() unshare()与clone()很像,不同的是unshare()不需要启动一个新进程
-
clone()
- UTS 通过在clone()方法的flags中选择CLONE_NEWUTS参数来实现隔离不同namespace下的主机名与域名
- IPC 同上面一样,通过CLONE_NEWIPC参数来实现不同namespace下的进程间通信隔离(信号量、消息队列、共享内存),下列的不同namespace不再重复介绍传参方式
- PID PID namespace隔离非常实用会对进程PID重新编号,所以不同namespace下PID可以相同
[root@cf proc]# docker exec -ti 69aa00d7aa3b /bin/bash
root@69aa00d7aa3b:/data# echo $$
18
root@69aa00d7aa3b:/data# exit
exit
[root@cf proc]# echo $$
28512
- Unix系统中,PID为1的进程是init,它是所有进程的父进程,负责维护进程表,因此若在Docker容器中运行多个进程,最先启动的进程应该是具有资源管理能力的,init进程还可以对信号进行捕捉,如Docker中接收容器结束信号后结束容器进程回收资源 在PID namespace下unshare()与setns()方法会有一些变化,其方法的调用者进程并不进入新的PID namespace,接下来的创建子进程才会在新的namespace。例如在docker中,docker exec会使用setns()加入一个已存在的namespace,但是最终还是会调用clone()函数
- MOUNT MOUNT namespace是第一个Linux namespace,所以标识符并不是CLONE_NEWMOUNT而是CLONE_NEWNS。创建MOUNT namespace时,会把当前的文件结构复制给新的namespace,新的namespace中的mount操作只会影响自身的文件系统,然后通过挂载传播来决定挂载事件的传播到别的挂载对象
- Network Network namespace主要是对网络资源的隔离,不同的Network namespace间可以通过创建veth pair(虚拟网络设备对,一端在新的namespace下,一端在原先的namespace中连接物理网络设备)来实现通信 在建立veth pair之前新旧namespace使用pipe(管道)来通信
- User User namespace主要是对用户ID、root目录、特殊权限等的隔离
- WordPress删除头部wp_head()多余代码
- 域名fde.com在国内平台以11万元被秒
- 微信小程序助力实体店对接互联网市场
- PostgreSQL 与 MySQL 相比,优势何在?
- Setting Up KeePass For Centos 6
- 拼音米大热!快视”、“冰冰”等多个域名结拍
- 入门必读:Hadoop新手学习指导
- 使用密码记录工具keepass来保存密码
- 机器人带着VR学习,最后学会了人工智能
- 超经典的JBOSS入门文章
- ASP.NET2.0应用中定制安全凭证
- AI造的AI,比人造的还厉害,该喜还是该忧?
- Mono 3.2 测试NPinyin 中文转换拼音代码
- Reactive Extensions介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法