在《容器vs.虚拟机:状态管理、网络和蔓延》中我们提到了应用Docker时可能会碰到的困难以及容器技术和虚拟机架构各自的优势与劣势。我们讨论了状态管理、网络和蔓延等广泛存在于IT行业的问题。虽然对于Docker来说解决这些问题的难度可能更大些,不过Docker与虚拟机相比也有着自己的优势。
当我们谈到虚拟机蔓延时所考虑的是资源管理上的问题。如果说的是关闭容器的话,Docker就有一个明显的优势-镜像的确定性。Docker容器我们可以清晰地查看镜像的历史和状态,所以要找出那些使用同一镜像的容器是非常方便的。
容器的替换也很容易。对于虚拟机我们需要管理磁盘快照、镜像和版本等等,但对Docker来说这些工作都可以轻松完成所以蔓延的风险并不是很大。
就网络功能来说虚拟机确实更加灵活,支持的配置和拓扑也更多。不过对Docker来说,如果容器在同一主机可以使用桥接网络,各个主机间也可以使用overlay网络。Docker还推出了一个将引擎聚合成swarm单元的功能来方便容器的管理,聚合成swarm单元的容器可以被视为同一个Docker引擎暴露给外界。从管理的角度来看这为Docker提供了某种程度的自主性,swarm和容器可以分开管理互不干涉。技术不管简单还是复杂,只要能解决问题就可以。
虚拟机挂起是一个很有用的功能,不过要是对比的话Docker可以用一种不同的流程来实现和虚拟机挂起类似的功能。Docker可以轻松地启动和关闭一个轻量级的环境,这一过程是完全自动的,而且可靠性很高,所以只要启用一个新的容器就好。如果比较的是服务的运行时间而不是某个机器的运行时间的话,Docker未必有明显的劣势。
一个服务器连续运行几年固然是给人印象很深的一个成绩,但对于无状态应用模型来说根本没必要。Docker启动关闭容器和生成镜像的便捷使得启用一个新的容器非常方便。机器运行的时间越长,出问题的机会也就越大。
在我们选择工具的时候有一个原则:系统设计决定工具而不是工具决定设计,所以在需要用容器的时候就应该大胆地用,不要被它不如虚拟机的地方束缚了。