在现代的开发流程中随处可见 Docker 的身影,Docker 提供了环境隔离、应用打包等功能让服务部署变得特别简单,本文将会浅析 Docker 背后所使用的技术,阅读完后,你可以搞清楚如下问题:
- 容器与虚拟机之间的差别
- Docker 资源隔离的原理
- Docker 资源限制的原理
- Docker 分层结构的原理
容器 vs 虚拟机
虚拟机(VM)是计算机系统的仿真器,通过软件模拟具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,能提供物理计算机的功能。
虚拟机通过在当前的真实操作系统上通过 Hypervisor 技术进行虚拟机运行环境与体系的建立并通过该技术进行资源控制,一个性能较好的物理机通常可以承载多个虚拟机,每个虚拟机都会有自己操作系统,如图 1.1 所示
从图中可以看出,虚拟机提供了物理机硬件级别的操作系统隔离,这让不同虚拟机之间的隔离很彻底,但也需要消耗更多资源,而有时不需要这么彻底的隔离,而更希望不消耗那么多资源,此时就可以使用容器技术。
容器可以提供操作系统级别的进程隔离,以 Docker 为例,当我们运行 Docker 容器时,此时容器本身只是操作系统中的一个进程,只是利用操作系统提供的各种功能实现了进程间网络、空间、权限等隔离,让多个 Docker 容器进程相互不知道彼此的存在,如图 1.2 所示。
虚拟机技术与容器技术的最大区别在于:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核。
Docker 资源隔离:Linux Namespace
Linux Namespace(Linux 命名空间)是 Linux 内核(Kernel)提供的功能,它可以隔离一系列的系统资源,如 PID(进程 ID,Process ID)、User ID、Network、文件系统等。
如果你熟悉 Linux,你可能会联想到 linux 中的 chroot 命令,该命令允许将当前目录修改成根目录(即根目录 / 的挂载点切换了),相当于文件系统被隔离了,Namespace 也具有相似的功能,但更加强大。
目前 Linux 主要提供 6 种不同类型的 Namespace,如下表所示。