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
posted @ 2021-11-03 16:01  虾敏四把刀  阅读(261)  评论(0)    收藏  举报