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()不需要启动一个新进程
  • 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目录、特殊权限等的隔离

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏匠心独运的博客

消息中间件—RabbitMQ(集群监控篇1)

摘要:任何没有监控的系统上线,一旦在生产环境发生故障,那么排查和修复问题的及时性将无法得到保证

31730
来自专栏Golang语言社区

几种服务器端IO模型的简单介绍及实现(下)

5、使用事件驱动库libevent的服务器模型 Libevent 是一种高性能事件循环/事件驱动库。 为了实际处理每个请求,libevent 库提供一种事件机制...

38490
来自专栏IT技术精选文摘

JVM致命错误日志(hs_err_pid.log)分析

当jvm出现致命错误时,会生成一个错误文件 hs_err_pid<pid>.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致cr...

71050
来自专栏星流全栈

Meteor React Native 项目模板更新啦!

14130
来自专栏JackeyGao的博客

一个超级小的 Django 项目.

当用最简单的代码实现 Django 项目为最基本的要素的时候, 项目可以和微框架一样小.

23020
来自专栏owent

Linux 编译安装 GCC 4.9

GCC4.9发布啦,本脚本在之前4.8的基础上做了稍许改进,更新 PS:4.9.0 开始支持C++1y特性 GCC 4.9 的大致变更如下,因为我只用C/C...

60510
来自专栏Golang语言社区

几种服务器端IO模型的简单介绍及实现(下)

5、使用事件驱动库libevent的服务器模型 Libevent 是一种高性能事件循环/事件驱动库。 为了实际处理每个请求,libevent 库提供一种事件机制...

29770
来自专栏容器云生态

Openstack平台搭建之第二天

Openstack平台搭建之第二天 If you have any question ,please contact me by weichuangxxb@si...

544100
来自专栏java初学

memcached

31960
来自专栏散尽浮华

Centos7下关于系统用户密码规则-运维笔记

1)密码长度、有效期 /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文...

44840

扫码关注云+社区

领取腾讯云代金券