首先,大家需要明确一点,docker容器不是虚拟机。
2014年,当我第一次接触docker的时候,我把它比做一种轻量级的虚拟机。这样做无可厚非,因为docker最初的成功秘诀,正是它比虚拟机更节省内存,启动更快。docker不停地给大家宣传,”虚拟机需要数分钟启动,而docker容器只需要50毫秒”。
然而,docker容器并非虚拟机,我们不妨来比较一下它们。
理解虚拟机
使用虚拟机运行多个相互隔离的应用时,如下图:
从下到上理解上图:
- 基础设施(infrastructure)。它可以是你的个人电脑,数据中心的服务器,或者是云主机。
- 主操作系统(host operating system)。你的个人电脑之上,运行的可能是macos,windows或者某个linux发行版。
- 虚拟机管理系统(hypervisor)。利用hypervisor,可以在主操作系统之上运行多个不同的从操作系统。类型1的hypervisor有支持macos的hyperkit,支持windows的hyper-v以及支持linux的kvm。类型2的hypervisor有virtualbox和vmware。
- 从操作系统(guest operating system)。假设你需要运行3个相互隔离的应用,则需要使用hypervisor启动3个从操作系统,也就是3个虚拟机。这些虚拟机都非常大,也许有700mb,这就意味着它们将占用2.1gb的磁盘空间。更糟糕的是,它们还会消耗很多cpu和内存。
- 各种依赖。每一个从操作系统都需要安装许多依赖。如果你的的应用需要连接postgresql的话,则需要安装libpq-dev;如果你使用ruby的话,应该需要安装gems;如果使用其他编程语言,比如python或者node.js,都会需要安装对应的依赖库。
- 应用。安装依赖之后,就可以在各个从操作系统分别运行应用了,这样各个应用就是相互隔离的。
理解docker容器
使用docker容器运行多个相互隔离的应用时,如下图:
不难发现,相比于虚拟机,docker要简洁很多。因为我们不需要运行一个臃肿的从操作系统了。
从下到上理解上图:
- 基础设施(infrastructure)。
- 主操作系统(host operating system)。所有主流的linux发行版都可以运行docker。对于macos和windows,也有一些办法”运行”docker。
- docker守护进程(docker daemon)。docker守护进程取代了hypervisor,它是运行在操作系统之上的后台进程,负责管理docker容器。
- 各种依赖。对于docker,应用的所有依赖都打包在docker镜像中,docker容器是基于docker镜像创建的。
- 应用。应用的源代码与它的依赖都打包在docker镜像中,不同的应用需要不同的docker镜像。不同的应用运行在不同的docker容器中,它们是相互隔离的。
对比虚拟机与docker
docker守护进程可以直接与主操作系统进行通信,为各个docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,docker可以节省大量的磁盘空间以及其他系统资源。
说了这么多docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而docker通常用于隔离不同的应用,例如前端,后端以及数据库。
如果你对docker感兴趣的话,不妨学习一下dive into docker course。