除非与世隔绝,否则您一定听说过 Docker 或 Docker 容器,或者至少听说过容器化的概念。但我们都非常清楚,该技术领域包含太多特性,以至于我们对每种特性稍加了解都做不到。随着我对 Docker 的了解越来越多,我就在想“如果有人问起 Docker,不知道我能否跟他解释清楚。”如果您也遇到同样的问题,那么这篇文章非常适合您。
问题
对于任何技术,人们会问的第一个问题是“它能解决哪个(些)问题?”在我看来,Docker 能解决 DevOps 中的以下让人头痛的难题:
依赖项矩阵 – 应用程序拥有直接依赖项。每个依赖项都有自己的依赖项,等等。
“在我的机器上工作” – 在您努力部署来自源存储库的最新代码时,您的同事会这样说。这可能是您从同事那里得到的最恼人、最无用(但最诚实)的回答。我经常听到(和说)这句话。您可能知道这种情况:您竭尽所能让代码在本地运行,并尝试记录您执行的每步操作(对吧?),但这个问题还是反复意外出现。
应用程序成熟度 – 随着应用程序的逐渐成熟,以及依赖项的升级,您需要处理依赖项树(即依赖项“矩阵”),并确保这些依赖项能够在您将要测试的每个目标环境中反映出来。
集成挑战 – 在将应用程序迁移到不同环境时,您需要了解在目标主机上运行的其他业务线应用程序,并在每次迁移中逐个解决每个环境中的这些应用程序的问题。
“开始搜寻吧!”– 在迁移到更高级的环境并出现新问题时,您必须(经常)询问“此环境与上一个一切正常的环境有何差异?”,并手动匹配这些环境来解决差异。
“嗯,此应用程序已准备好部署到云,对吧?”– 询问您的经理(和经理的经理,等等)。在 DevOps 保持对每个环境的控制时,很难实施传统的一次迁移/测试一个环境的战略。但目前在采用属于外包环境的平台即服务 (PaaS) 时,我们能够从目标环境中抽离出来,而且上述问题混合在一起,使得可靠地部署应用程序几乎变得不可能。
Docker 不是什么
如果您熟悉服务器虚拟化(比如 VMWare),则很容易认为容器化和服务器虚拟化是同义词。尽管存在一定的重叠,比如应用程序隔离和资源管理效率改进,但它们是不同的。
使用虚拟机 (VM) 的服务器虚拟化将会解决类似这样的问题:
? 数据中心能源使用优化(即环保)
? 减少供应商锁定
? 更快地配置服务器
? 更长的正常运行时间
服务器虚拟化依赖于一个称为管理程序的组件,该组件从基础硬件中抽象出虚拟机 (VM)。这种硬件抽象要求虚拟机管理程序是一个非常庞大的软件!
另一方面,像 Docker 这样的容器从操作系统抽象出应用程序,对于 Docker,这是通过 Docker Container Engine 实现的。应用程序能在同一个操作系统实例上隔离地运行,实现更小的资源占用。简言之,服务器虚拟化和容器化类似,但有不同的设计目标,而且在数据中心内实现不同的结果。
解决方案
就像船运集装箱通过让船运负荷不透明且标准化来改革海外进口/出口行业一样,Docker 容器实现了开发人员所寻求的应用程序隔离而没有虚拟机管理程序的开销。
依赖项矩阵 – 您的应用程序拥有依赖项,这不属于 Docker 的管辖范畴。作为开发人员,我们的工作是确保我们的软件拥有正确的依赖项,以便能够正确运行。但一旦解决了我的依赖项(比如通过 Maven 构建过程),Docker 将通过 Docker 镜像确保它们在不同环境中是一致的。
“在我的机器上工作” – Docker 镜像中捕获了让源代码在您的环境中运行所需的更改。所以当您的同事需要运行代码时,他们可以下载该镜像以及代码(和依赖项),代码可以直接运行。
应用程序成熟度 – 随着应用程序逐渐成熟,它的依赖项也会自然地发生更改。和依赖项矩阵一样,Docker 无法帮我确定这一点,但一旦它发挥了作用,我就可以修改镜像,而且现在它可以在我部署应用程序的每个环境中运行。
集成挑战 – 同样地,Docker 的设计挽救了局面。我的 Docker 镜像在确保各种环境之间的一致性的同时,还可以与目标主机上运行的其他应用程序保持一定程度的隔离(而没有服务器虚拟化管理程序的开销)。所以集成已不是问题。
“开始搜寻吧!”– Docker 容器镜像对每个环境都一样,所以不需要进行手动区分。
“嗯,此应用程序已准备好部署到云,对吧?”– IBM Bluemix 等平台即服务 (PaaS) 提供者可以确保 Docker 容器将部署到不同平台并一致地运行。可以配置任何运行 Docker 的云提供者(比如 IBM、Amazon WS 和 Rackspace 等),使您只需将您的 Docker 镜像推送到云,您的应用程序就能运行。
对 Docker 和容器的最终评价
Docker 有助于实现更快的开发周转速度、应用程序隔离和部署间的一致性,实现轻松的集成和更好的 DevOps 体验。当然,Docker 并不能够解决所有 DevOps 问题。但这种令人兴奋的技术可确保所有目标环境之间的一致性,让 DevOps 人员生活得更轻松。
CIO之家 www.ciozj.com 公众号:imciow