1. 什么是容器?
通俗讲容器是类似集装箱一样的东西。把应用装进箱子,箱子有自己的“边界”,不会互相干扰;也可以方便的搬运。
2. “边界”—楚门的世界
如何实现“边界”技术?以进程为例,进程是程序运行后计算机执行环境的一个总和,而容器技术就是通过约束和修改进程的动态表现,为进程创造一个“边界”。而这一切其实都只是让进程看起来在一个容器里的障眼法。
实现这种障眼法技术,对于大多数像Docker这样的linux容器都是用到Namespace技术和Cgroups技术。
- Namespace:修改视图
- Cgroups:制造约束和隔离
3. Namespace技术
Namespace技术用来修改进程的视图,让被隔离的进程只能看到所指定的内容。
例如:
Mount Namespace 可以让隔离进程只看到当前 Namespace 的挂载点信息。
Network Namespace 可以让隔离进程只能看到当前 Namespace 的网络设备。
除此之外还有 User、IPC、UTS等等Namespace。
而Docker容器其实就是在创建容器进程的时候指定了一系列的Namespace参数,对其他的不相关的资源或是配置就完全看不到了。
容器就是一种特殊的进程。这也是Linux容器最基本的实现原理,一切都是障眼法。
4. Cgroups技术
既然容器只是一种特殊进程,多个容器之间实际还是共用的同一个宿主机操作系统的内核。
Namespace做为“进程视图”的隔离手段,实际隔离得并不彻底。
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
在Linux系统中 Cgroups 以文件和目录的实现出现在 /sys/fs/cgroup 目录下。在这个目录下有很多子目录,也叫做子系统。
比如 /sys/fs/cgroup/cpuset、/sys/fs/cgroup/cpu、 /sys/fs/cgroup/memory。
这些子系统则定义了操作系统可以被限制的资源类型,目录下面有对应资源的配置文件。
使用这些子系统的限制功能,只需要在对应的子系统下新建一个目录,系统会自动生成对应的配置文件,修改对应的配置,并把需要限制的进程ID追加到tasks文件中,就可以实现对目标进程的资源隔离。
5. 总结
一个正在运行的 Docker 容器,其实就是一个启用了多个 Linux Namespace 的应用进程,而这个进程能够使用的资源量,则受 Cgroups 配置的限制。
