Docker学习笔记(四):Namespace、Cgroups与Overlay
Namespace
Linux Namespace是Kernel的一个功能,它可以隔离一系列系统资源。
| Namespace类型 | 系统调用参数 | 备注 |
|---|---|---|
| UTS | CLONE_NEWUTS | 允许拥有自己的hostname |
| IPC | CLONE_NEWIPC | 实现IPC隔离 |
| PID | CLONE_NEWPID | 隔离进程ID,实现同一个进程在不同PID Namespac拥有不同pid |
| Mount | CLONE_NEWNS | 隔离各进程看到的挂载点视图。 因为MOUNT Namespace是LInux实现的第一个Namespace类型,没有意识到以后的情况,所以它的系统调用参数是CLONE_NEWNS |
| User | CLONE_NEWUSER | 隔离用户ID和用户组ID |
| Network | CLONE_NEWNET | 隔离网络设备、IP地址端口等网络栈。 |
Cgroups v1
Linux Cgroups允许将进程组成层次化的组,并且控制和监视他们对资源的使用,这些资源包括CPU、内存、存储、网络等。
这些功能通过cgroup和subsystem实现。
cgroup
cgroup是对进程分组管理的机制,一个cgroup包含若干个进程。
subsystem
subsystem是资源控制模块,也称resource controller(资源管理器)。
/sys/fs/cgroup下是所有可用的subsystem
root@xiamin:~# ls /sys/fs/cgroup/
blkio cpu cpu,cpuacct cpuacct cpuset devices freezer hugetlb memory net_cls net_cls,net_prio net_prio perf_event pids rdma systemd unified
可以在每个subsystem建立多个目录,每个目录就是一个cgroup,cgroup下可以继续创建cgroup。
将进程ID写入到cgroup目录cgroup.procs文件中就完成了进程与cgroup的关联。
Overlay
overlay是一种联合文件系统,它分为底层(lowerdir,只读)和顶层(upperdir,读写)两层。对外提供一个merge后的视图,我们暂且称为merged。
在需要修改时,使用CoW(Copy On Write)将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper中。
在docker中,只读的底层和可写的顶层分别对应image和container。
读
- 文件在顶层不存在,从底层读取
- 文件在顶层存在,无论底层是否存在,都从顶层读取
修改
- 文件在顶层存在,直接修改
- 文件在顶层不存在,只在第一次修改时将文件从底层复制到顶层,以后操作都在顶层。
删除
- 顶层文件会被直接删除
- 底层文件会在顶层创建一个相同文件名,但是权限为
c---------的文件,也就是没有任何权限。merged中不会感知到这些文件的存在。
实操
mount挂载overlay的命令详情可以man mount,然后搜索overlay。
准备目录和文件
root@xiamin:/tmp/testoverlay$ mkdir lower upper merged work
root@xiamin:/tmp/testoverlay$ echo 1 > lower/a.txt
root@xiamin:/tmp/testoverlay$ echo 2 > lower/b.txt
root@xiamin:/tmp/testoverlay$ mkdir lower/test
root@xiamin:/tmp/testoverlay$ echo 3 > upper/c.txt
root@xiamin:/tmp/testoverlay$ tree
├── lower
│ ├── a.txt
│ ├── b.txt
│ └── test
├── merged
├── upper
│ └── c.txt
└── work
└── work
挂载到merged目录
root@xiamin:/tmp/testoverlay$ mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged
root@xiamin:/tmp/testoverlay$ tree
├── lower
│ ├── a.txt
│ ├── b.txt
│ └── test
├── merged
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── test
├── upper
│ └── c.txt
└── work
└── work
读文件
root@xiamin:/tmp/testoverlay$ cat merged/a.txt
1
root@xiamin:/tmp/testoverlay$ cat merged/c.txt
3
修改文件
root@xiamin:/tmp/testoverlay$ echo 11 >> merged/a.txt
root@xiamin:/tmp/testoverlay$ tree
.
├── lower
│ ├── a.txt
│ ├── b.txt
│ └── test
├── merged
│ ├── a.txt
│ ├── b.txt
│ ├── c.txt
│ └── test
├── upper
│ ├── a.txt
│ └── c.txt
└── work
└── work
可以看到upper中多除了一个 a.txt 文件,分别看一下lower与upper下的a.txt内容
root@xiamin:/tmp/testoverlay$ cat lower/a.txt
1
root@xiamin:/tmp/testoverlay$ cat upper/a.txt
1
11
可以看到 lower/a.txt 内容没有变化,upper/a.txt内容确实是追加了"11"。
删除文件
root@xiamin:/tmp/testoverlay$ cd merged/
root@xiamin:/tmp/testoverlay/merged$ rm -rf b.txt test/ c.txt
root@xiamin:/tmp/testoverlay/merged$ tree ..
├── lower
│ ├── a.txt
│ ├── b.txt
│ └── test
├── merged
│ └── a.txt
├── upper
│ ├── a.txt
│ ├── b.txt
│ └── test
└── work
└── work
可以看到lower中的文件无变化,upper中的c.txt被删除了,但是多了 b.txt 和 test。
查看一下这两个文件的权限,果然是c---------
root@xiamin:/tmp/testoverlay$ ll upper/
-rw-r--r-- 1 root root 5 May 19 13:18 a.txt
c--------- 1 root root 0, 0 May 19 13:20 b.txt
c--------- 1 root root 0, 0 May 19 13:20 test

浙公网安备 33010602011771号