什么是Docker?Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司(后改名为Docker Inc)内部的一个开源的PaaS服务的业余项目。其基于谷歌公司推出的Go语言进行开发实现,后加入Linux基金会,遵从Apache 2.0协议,项目代码在GitHub上进行维护。
Docker是基于Linux内核的cgroup、namespace以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其他的隔离的进程,因此也称其为容器。
Docker最初的实现是基于LXC(Linux Containers)。LXC是Linux原生支持的容器技术,可以提供轻量级的虚拟化。可以说Docker就是基于LXC发展起来的,提供LXC的高级封装和标准的配置方法。在LXC的基础之上,Docker进行了进一步的封装,从文件系统、网络互联到进程隔离等待,极大地简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷。从Docker 0.7以后开始去除了LXC,转而使用自行开发的libcontainer;从Docker 1.11开始,则进一步演进为使用runC和containerd。
Docker的主要目标是“Build、Ship and Run Any App、Anywhere”,即通过对应用组件的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的“一次封装,到处运行”(Build once,Run anywhere)。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统。
将应用运行在Docker容器上,可以实现跨平台、跨服务器,只需一次配置准备好相关的应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问题,从而极大地提升了部署效率,减少故障的可能性。
Docker与虚拟机有着类似的资源隔离和分配的特点,但不同的架构方法使Docker能够更加便携、高效(见图1)。
图1 VM与Docker架构比较
传统的虚拟机架构是:物理机→宿主机操作系统→Hypervisor支持→虚拟机操作系统→应用程序。虚拟机是在宿主机上基于Hypervisor虚拟出一套操作系统所需的硬件设备,并在这些虚拟硬件上安装操作系统Guest OS,运行不同的应用程序,应用之间实现相互独立、资源隔离。但由于需要Hypervisor来创建虚拟机,且每个虚拟机里需要完整地运行一套操作系统Guest OS,因此会带来很多额外资源的开销。
Docker的架构是:物理机→宿主机操作系统→Docker引擎→应用程序。Docker容器中没有Hypervisor这一层,虽然它需要在宿主机中运行Docker Engine,但原理却完全不同于Hypervisor,并没有虚拟出硬件设备,更没有独立部署全套的操作系统Guest OS。
Docker容器是使用Docker Engine而不是管理程序来执行,因此容器比虚拟机小,并且由于主机内核的共享,可以更快地启动,具有更好的性能、更少的隔离和更好的兼容性。
Docker容器能够共享一个内核并共享应用程序库,因此容器比虚拟机具有更低的系统开销,只要用户愿意使用单一平台来提供共享的操作系统,容器可以更快、使用资源可以更少。
虚拟机可能需要几分钟才能创建并启动,而只需几秒钟即可创建并启动一个容器。与在虚拟机中运行应用程序相比,容器中包含的应用程序提供了卓越的性能。