Comtainerd Cgroup Namespace
文章简介:Docker Cgroup , Namespace , union fs 运行机制
Namespaces
命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法.
Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS(分别对应 Cgroup, IPC, Network, Mount, PID, User, UTS),通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。
the Network namespace encapsulates system resources related to networking such as network interfaces (e.g wlan0, eth0), route tables etc, the Mount namespace encapsulates files and directories in the system, PID contains process IDs and so on. So two instances of a Network namespace A and B (corresponding to two boxes of the same type in our analogy) can contain different resources - maybe A contains wlan0 while B contains eth0 and a different route table copy – related
|
|
|
|
unshare
会在一个新的 namespace 执行新的程序,flag -u
指定新的 UTS
namespace, sudo unshare -u bash
即是在新的UTS
命名空间执行 bash
linux 以默认的 namespace 启动新的程序,除非明确的指定
user namespace
P$ Q$ 不同的字母代表不同的 user namespace
|
|
/proc/$pid/uid_map
the map file
/proc/$pid/uid_map
returns a mapping from UIDs in the user namespace to which the process pid belongs, user_namespace linux man page
每一行的格式为 $fromID $toID $length
,
|
|
|
|
mount namespace
|
|
|
|
说明 unshare -m bash
并没有按照预期在新的 mount namespace 中运行
所以为了验证mount namespace
, 我们需要做如下一些事情:
- 创建命令所需的依赖项和系统文件的副本
- 创建一个新的
mount namespace
- 将新挂载命名空间中的根文件系统替换为由我们的系统文件副本组成的根文件系统。
- 在新的安装名称空间内执行程序
进行实验
|
|
Pivot root
|
|
到这里,已经创建了一个隔离的 rootfs
进程
|
|
有两个进程很特殊,pid={1,2}, 这两个进程都是被 Linux 中的上帝进程 idle 创建出来的
- pid=1 的
/sbin/init
, 执行内核的一部分初始化工作和系统配置,也会创建一些类似 getty 的注册进程 - pid=2 的
kthreadd
, 管理和调度其他的内核进程
网络
在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中。我们可以使用如下的命令来查看当前网桥的接口:
|
|
docker0 会为每一个容器分配一个新的 IP 地址并将 docker0 的 IP 地址设置为默认的网关。网桥 docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables 转发到 docker0 并由网桥分发给对应的机器。
|
|
ip
|
|
ip netns list
只显示命名的 netns,初始 netns 是非命名 netns。并且每一个命名 netns 都会在/var/run/netns
创建同名文件,这个文件可以让进程切换到此 netns
C$
代表在一个子命名空间中执行
|
|
现在在此 netns 中只可以与同 netns 的进程进行沟通(localhost),我们可以尝试与 init netns 的程序进行沟通
Veth Devices
|
|
现在 veth1 设备已经可以在两个 netns 中看到,为了是他们都可以工作,我们需要给它们两个ip addresses
和让interface up
|
|
现在 veth0
和 veth1
已经 up
和赋予了 ip address 10.1.1.1
10.1.1.2
|
|
netlink
libnetwork
chroot
https://www.ibm.com/developerworks/cn/linux/l-cn-chroot/index.html
CGroups
https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html
UnionFS
docker export $(docker create busybox) | tar -C rootfs -xvf - AUFS overlay2
查看系统是否支持相应的文件系统
|
|
有一些系统这种方式找不到对应的系统,但是同样支持此文件系统,比如 archlinux
发行版,Overlay_filesystem, overlay-docker-doc
|
|
overlay2 将 lowerdir、upperdir、workdir 联合挂载,形成最终的 merged 挂载点,其中 lowerdir 是镜像只读层,upperdir 是容器可读可写层,workdir 是执行涉及修改 lowerdir 执行 copy_up 操作的中转层(例如,upperdir 中不存在,需要从 lowerdir 中进行复制,该过程暂未详细了解,遇到了再分析)
|
|
获得的文件系统是有层次的,当前的层次关系为:
|
|
|
|
references
-
调试网络
docker run -it --net container:vibrant_blackburn nicolaka/netshoot
-
https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt