2014-10-14 13:25:01 +08:00
# 底层实现
2014-09-18 10:45:17 +08:00
2016-11-15 03:56:29 +08:00
Docker 底层的核心技术包括 Linux 上的命名空间( Namespaces) 、控制组( Control groups) 、Union 文件系统( Union file systems) 和容器格式( Container format) 。
2014-09-18 10:45:17 +08:00
2014-10-14 13:25:01 +08:00
我们知道,传统的虚拟机通过在宿主主机中运行 hypervisor 来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。
2014-09-18 10:45:17 +08:00
这种直接的做法实现了对资源最完整的封装,但很多时候往往意味着系统资源的浪费。
2014-10-14 13:25:01 +08:00
例如,以宿主机和虚拟机系统都为 Linux 系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。
2014-09-18 10:45:17 +08:00
2014-10-14 13:25:01 +08:00
我们知道, 在操作系统中, 包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU 等等,所有的资源都是应用进程直接共享的。
2014-09-18 10:45:17 +08:00
要想实现虚拟化, 除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外, 还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。
前者相对容易实现一些,后者则需要宿主机系统的深入支持。
2016-11-15 03:56:29 +08:00
随着 Linux 系统对于命名空间功能的完善实现, 程序员已经可以实现上面的所有需求, 让某些进程在彼此隔离的命名空间中运行。大家虽然都共用一个内核和某些运行时环境( 例如一些系统命令和系统库) , 但是彼此却看不到, 都以为系统中只有自己的存在。这种机制就是容器( Container) , 利用命名空间来做权限的隔离控制, 利用 cgroups 来做资源分配。