Cgroup 技术
Namespace 技术:进程隔离,调用 clone() 创建进程,mount,network,ipc,user 等都是进程隔离
chroot
容器其实是一种特殊的进程。
Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”;而 Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。
Namespace 技术
namespace 和 cgroup 本身是 Linux 内核提供的技术,docker 容器在创建时,运行了 namespace ,使得容器内部看似是独立的一个空间,进程只是容器内运行的进程,而看不到外部宿主机的进程,但是实际上宿主机层面来看,docker 容器内部的进程也只是宿主机中的一个被隔离的进程而已。
Linux 提供一下 namespace 技术,都可以通过调用 clone() 函数来完成。当然其他信息,比如时间,就是不隔离的。容器内修改时间,也会影响宿主机。
int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);
在 linux 4.6 之后,支持 cgroup namespace ,原先使用 lxcfs 来解决容器的 cgroup 问题,即容器中的 app 启用时使用了超过 cgroup 限制的资源上限, cgroup namespace 同样解决这个问题。但是 cgroup namespace 更加安全,每个 namespace 中的进程都有自己 cgroups root 和 cgroup filesystem 视图。
http://hustcat.github.io/cgroup-namespace/
https://lwn.net/Articles/621006/
Cgroup 技术
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
通过 cgroup 设置,限制容器的资源,比如 cfs_quota_us 和 cfs_period_us ,也可以对进程限制,tasks。blkio (IO),cpuset,memory。
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
-1
$ cat /sys/fs/cgroup/cpu/container/cpu.cfs_period_us
100000
Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合。
也可以查看具体容器的信息
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us
100000
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us
20000
lxcfs
lxcfs 用于容器中的 app,正确执行 cgroup 中容器的资源限制,而不是查看宿主机的资源信息,而启动一个超出 cgroup 限制的资源,而被 cgroup 杀掉。
/proc/cpuinfo
/proc/diskstats
/proc/meminfo
/proc/stat
/proc/swaps
/proc/uptime
/sys/devices/system/cpu/online
当容器启动时,/proc/xxx会被挂载成host上lxcfs的目录。app读取/proc/meminfo的信息时,请求就会被导向lxcfs,而lxcfs就会通过cgroup的信息来返回正确的值给容器内的app。
rootfs
whiteout 文件:把只读层里的文件遮挡起来,实现删除功能
borg

