Docker是什么
Docker是基于Go语言实现的开源容器项目,由Docker公司的团队编写,能够把开发的应用程序自动部署到容器的开源的应用容器引擎。它诞生于2013年初,最初发起者是dotCloud公司(Docker公司的前身),基于Apache 2.0开源授权协议发行。
Docker的构想是要实现"Build, Ship and Run Any App, Anywhere",即通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期进行管理,达到应用组件级别的"一次封装,到处运行"。这里的应用组件,既可以是一个Web应用、一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
基于Linux平台上的多项开源技术,Docker提供了高效、敏捷和轻量级的容器方案,并支持部署到本地环境和多种主流云平台。可以说,Docker首次为应用的开发、运行和部署提供了"一站式"的实用解决方案。
任何使用Docker运行的软件本质是在一个容器中运行。Docker使用现有的容器引擎,根据最佳实践提供一致的Docker构建方案,并提供更强的安全性。使用Docker,用户可以以更低的成本使用容器技术。可以将Docker容器理解为一种轻量级的沙盒(Sandbox)。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统虚拟机。很多时候,甚至直接把容器当作应用本身也没有任何问题。
Docker解决了什么问题
实现了应用程序和运行平台的解耦
Docker通过容器来打包应用、解耦应用和运行平台。当应用需要迁移的时候,只需在新的服务器上启动需要的容器即可,无论新旧服务器是否是同一类型的平台。这无疑可以节省大量的宝贵时间,并降低部署过程出现问题的风险。
对开发和运维(DevOps)人员来说,最梦寐以求的效果可能就是一次创建或配置,之后可以在任意地方、任何时间让应用正常运行,而Docker正是实现这一目标的利器。具体来说,在开发和运维过程中,Docker具有如下几个方面的优势:
(1) 更快速的交付和部署。使用Docker后,开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成后,测试和运维人员可以直接使用完全相同的环境来部署代码。只要是开发测试过的代码,就可以确保在生产环境运行。Docker可以快速创建和删除容器,节约开发、测试、部署的大量时间。
(2) 更高效的资源利用。运行Docker容器不需要额外的虚拟化管理程序的支持,Docker是内核级的虚拟化,可以实现更高的性能,同时对资源的额外需求很低。与传统的虚拟机方式相比,Docker的性能要提高1-2个数量级。
(3) 更轻松的迁移和扩展。Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、混合云、个人电脑、服务器等。同时支持主流的操作系统发行版本。这种兼容性让用户可以在不同平台之间轻松地迁移应用。
(4) 更简单的更新管理。使用Dockerfile,只需小小的配置修改,就可以替代以往大量的更新工作。所有修改都以增量的方式被分发和更新,从而实现自动化并且高效的容器管理。
应用间组织关系更加有序
没有Docker前,同一个计算机上的多个应用遍布整个文件系统,并最终创造出一个相互影响的凌乱关系。示例如下:
使用Docker后,就通过容器和镜像实现了隔离。使用Docker后,上述示例调整为:
但是也应注意到隔离的代价是相同的依赖可能同时存在于多个容器中,在使用时要有所衡量。
提高了应用的可移植性
应用的依赖关系通常包含特定的操作系统。操作系统之间的可移植性是软件用户的一个主要问题。对主流操作系统(如Linux、MacOS、Windows)的支持是应用程序维护者的主要开销,而且经常被忽略。
主流操作系统包括Linux、MacOS、Windows等都已支持Docker。这也意味着基于Docker容器运行该软件,只需对一组依赖写一次即可。这样,应用程序通过Docker就获得了可移植性的能力。这种新的可移植性有以下优势:
(1) Docker容器带来的可移植性使软件可以在以前无法使用的地方运行。如某些应用程序是面向Linux开发的,现在则可以通过Docker容器运行在MacOS和Windows等其他操作系统上。
(2) Docker容器带来的可移植性使可在任何系统上运行相同的软件。这就意味着无论是本地环境、开发环境、测试环境都可以运行相同的程序。运行一致的环境是非常重要的。这样做有助于最大限度地减少采用新技术的学习曲线。它可以帮助软件开发人员更好地了解将要运行的系统。
(3) 软件维护人员可以集中精力在单一平台和一套依赖关系中编写自己的软件,这节省了大量的时间。
如果没有Docker或虚拟机,可移植性一般以单个程序为级别。如Java语言编写的应用程序可以在多个操作系统上正常运行,因为应用程序依赖于Java虚拟机(JVM)的程序。这也从侧面说明随着Docker的崛起,Java语言的可移植性技术优势将逐渐丧失。
更好地保护计算机
软件程序可能有各种各样的情况,出现错误或带来安全风险:程序可能由攻击者编写、开发人员无意中编写出有害的错误程序、程序可能会意外地由于输入处理的故障,被攻击者利用,等等。无论哪种方式,运行软件都给计算机带来一定程度的安全威胁。由于运行软件是拥有计算机的主旨,应谨慎地应用实际的降低风险的措施。
容器的隔离性使容器里的任何东西都只能访问在它内部的东西。此规则有例外,但仅在用户显式创建时。容器限制了一个程序对其他程序带来的影响范围、可访问的数据和系统资源的影响范围。
Docker价值体现
Docker提供了所谓的抽象
抽象可以帮助以简化的方式处理复杂的工作。在使用Docker后,开发者不用再关注于安装应用程序相关的复杂性和细节,只需要考虑想安装什么样的软件。同时,这也适用于软件移除的情况。当需要删除软件时,开发者之需要告诉Docker要删除哪个软件。因为软件封装在容器中,所以不会存在散落在容器外的文件。
因为提供一个简单、轻量的建模方式,Docker上手非常快,用户只需几分钟,就可以把自己的程序"Docker化"(Dockerize)。
容器抽象和Docker所提供的容器管理工具,将改变系统管理和软件开发。Docker很重要,是因为它使得大家都可以使用容器,用它来节省时间、金钱和精力。
职责的逻辑分离
使用Docker后,开发人员只需要关心容器中运行的应用程序,而运维人员只关心如何管理容器,Docker的设计目的就是要加强开发人员写代码的开发环境与应用程序要部署的生产环境的一致性,从而降低那种"开发时一切都正常,肯定是运维的问题"的风险。
快速、高效地开发生命周期
Docker的目标之一是缩短代码从开发、测试到部署、上线运行的周期,让应用程序具备可移植性,易于构建,并易于协作。
Docker生态良好
众多互联网厂商在其云产品中使用Docker,并积极促进其发展。
简化了软件的安装、分发和删除等工作
Docker有跨平台和开放的特点。操作系统之间的界限变得开始模糊,在第三方产品的选择中操作系统不再是一个考量因素。
实现了基于操作系统的更好、更先进的隔离功能
容器技术以这种或那种形式存在了几十年,Docker的伟大之处在于,帮助开发者使用这些功能的同时,又没有那些复杂性。
鼓励使用面向服务的架构
Docker推荐单个容器只运行一个应用程序或进程,这样就形成了一个分布式的应用程序模型。在这种模型下,应用程序或服务都可以表示为一系列内部互联的容器,从而使分布式部署应用程序,扩展或调试应用程序都变得非常简单,同时也提高了程序的内聚性。
Docker的应用场景
Docker基于容器提供的隔离性可以为各种测试提供很好的沙盒环境。并且,容器本身就具有标准性的特征,使基于Docker的应用可以方便的移植到不同的平台。如物理机、虚拟机、公有云、私有云、混合云、个人电脑、服务器等。同时也支持主流的操作系统发行版本。此外,Docker通过对应用的封装(Packaging)、分发(Distribution)、部署(Deployment)、运行(Runtime)生命周期的管理,实现了应用组件级别的"一次封装,到处运行"。常见的Docker应用场景有:
(1) 加速本地开发和构建流程,使其更加高效、更加轻量化。本地开发人员可以构建、运行并分享Docker容器。容器可以在开发环境中构建,并轻松地提交到测试环境,并最终进入生产环境。Docker可以快速创建和删除容器,节约开发、测试、部署的大量时间。
(2) 能够让应用组件在不同的环境中,得到相同的运行结果。这一点在面向服务的架构和微服务架构的部署中尤为实用。
(3) 用Docker创建隔离的环境来进行测试。如使用Jenkins CI这些的持续集成工具启动一个用于测试的容器。
(4) 构建一个多用户的平台即服务(PaaS)基础设施。
(5) 为开发、测试提供一个轻量级的独立沙盒环境,或者将独立的沙盒环境用于技术教学,如Unix Shell的使用、编程语言教学等。
(6) 提供软件即服务(SaaS)的应用,如Redis服务。
(7) 高性能、超大规模的宿主机部署。
参考
《Docker实战》 Jeff Nickoloff 著, 胡震,杨润青 黄帅 译
《第一本Docker书》 James Turnbull 著, 李兆海, 刘斌, 巨震 译
《Docker技术入门与实战》 杨保华 戴王剑 曹亚仑 著