容器基础知识

Posted by kyle on March 28, 2019

容器与进程

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。容器,其实是一种特殊的进程而已。在使用Docker的时候,并没有一个真正的“Docker容器”运行在宿主机里面,Docker项目帮助用户启动的,还是原来的应用进程,只不过在创建这些进程时,Docker为它们加上了各种各样的Namespace参数。

Namespace机制

Namespace是Linux创建新进程的一个可选参数。

在Linux中创建线程的系统调用是clone(),比如:

int pid = clone(main_function, stack_size, SIGCHLD, NULL)

这个系统调用为我们创建一个新的进程,并且返回它的进程号pid。

而我们用clone()系统调用创建一个新进程时,就可以在参数中指定CLONE_NEWPID参数,比如:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL)

这时,新创建的进程将会处于一个全新的进程空间,在这个进程空间里,这些进程只能看到重新计算过的进程编号,而与别的进程隔离开了。

Namespace技术,实际上就是修改了应用进程看待整个计算机的“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。

Cgroups

Linux Cgroups(Linux Control Group)是Linux内核中用来为进程设置资源限制的一个重要功能。它的最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。

此外,Cgroups给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织在操作系统的/sys/fs/cgroup路径下。

Cgroups子系统
子系统名 作用
cpu 设定CPU限制
blkio 为块设备设定I/O限制
cpuset 为进程分配单独的CPU核和对应的内存字节
memory 为进程设定内存的使用限制

简单说来,Linux Cgroups就是一个子系统目录加上一组资源限制文件的组合。

总结

一个正在运行的Docker容器,其实就是一个启用了多个Linux Namespace的应用进程,而这个进程能够使用的资源量,则受Cgroups配置的限制。

摘录自 张磊 《深入剖析Kubernetes》