容器与进程
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。容器,其实是一种特殊的进程而已。在使用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》