本文共 2720 字,大约阅读时间需要 9 分钟。
摘要
敏捷开发已经流行了很长时间,如今有越来越多的传统企业开始践行敏捷开发所提倡的以人为中心、迭代、循序渐进的开发理念。在这样的场景下引入 Docker 技术,首要目的就是通过虚拟化方式,为开发团队建立一套可以复用的开发环境,让开发环境可以通过 Image 的形式分享给项目的所有开发成员,以简化开发环境的搭建。然而,在没有 Docker 技术之前就已经有类似 Vagrant 的开发环境分发技术,因此在本地开发环境方面 Docker 技术的优势并不能很好的发挥出来。笔者认为 Docker 的优点在于通过简化 CI(持续集成)和 CD(持续交付)的构建流程,让开发者可以更专注于开发工作。在引入 Docker 技术时,开发团队最大的问题是没有可遵循的业界标准。大家常常以最佳实践为口号,引入多种工具链,导致在使用 Docker 的过程中没有侧重点。涉及到 Docker 选型,又在工具学习上花费大量时间,而不是选用合适的工具以组建可持续发布产品的开发团队。基于这样的场景,我们可以把“简单易用”的原则作为评判标准,引入到 Docker 技术工具选型的参考中。
开发团队在引入 Docker 技术的过程中,首先需要解决的是让团队成员尽快掌握 Docker 命令行的使用。在熟悉了 Docker 命令行之后,团队需要解决几个关键问题:
Base Image 的选择:
包括了操作系统命令行和类库的最小集合,一旦启用,所有应用都需要以它为基础创建应用镜像。Ubuntu 作为官方使用的默认版本,是目前最易用的版本,但系统没有经过优化,可以考虑使用第三方有划过的版本,比如 phusion-baseimage。管理 Docker 应用配置工具的选择:
主要用于基于 Dockerfile 创建 Image 的配置管理。我们需要结合开发团队的现状,选择一款团队熟悉的工具作为通用工具。配置工具有很多种选择,其中 Jenkins 作为后起之秀,在配置管理的使用中体验非常简单易用,推荐大家参考使用。Host 主机系统的选择:
是 Docker 后台进程的运行环境。从开发角度来看,它就是一台普通的单机 OS 系统,我们仅部署 Docker 后台进程以及集群工具,所以希望 Host 主机系统的开销越小越好。这里推荐给大家的 Host 主机系统是 Alpin Linux,它是目前开销最小的主机系统。另外,还有 Red Hat 的开源主机系统,有基于 CentOS、Ubuntu 等多个版本的分支选择,也是不错的候选对象。当开发团队把代码提交到 Git 应用仓库的那一刻,我相信所有的开发者都希望有一个系统能帮助他们把这个应用程序部署到应用服务器上,以节省不必要的人工成本。但是,复杂的应用部署场景,让这个想法实现起来并不简单。
首先,我们需要有一个支持 Docker 的构建系统,这里推荐 Jenkins。Jenkins 可以方便的安装各种第三方插件,从而方便快捷的集成第三方的应用。通过 Jenkins 系统的 Job 触发机制,我们可以方便的创建各种类型的集成 Job 用例,但缺乏统一标准的 Job 用例使用方法,会导致项目 Job 用例使用的混乱,难于管理维护,这也让开发团队无法充分利用好集成系统的优势。
所以,敏捷实践方法提出了一个可以持续交付的概念(管道部署)。通过 Docker 技术,我们可以很方便的理解并实施这个方法。Jenkins 的管道部署把部署的流程形象化成为一个长长的管道,每间隔一小段会有一个节点,也就是 Job,完成这个 Job 工作后才可以进入下一个环节。
应用经过测试,接下来我们需要把它发布到测试环境和生产环境。这个阶段中如何更合理地使用 Docker 也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。实际,这个环境就是基于 Docker 的私有云,更进一步我们可能期望的是提供 API 接口的 PaaS 云服务。
为了构建此 PaaS 服务,这里推荐几款非常热门的工具方便大家参考,通过这些工具可以定制出企业私有的 PaaS 服务。
容器云平台是 Gartner 近些年提出来的云管理平台(Cloud Management Platform,CMP)的企业架构转型衍生品,参考 Gartner 的定义如下:云管理平台(CMP)是提供对公有云、私有云和混合云整合管理的产品。
从容器化角度总结起来就是两块:
容器云平台建设的目标是使企业业务应用被更好的运营管理起来。从云平台的建设步骤来说,大致需要经过以下步骤来梳理实践,顺序不限:
选择运行时容器引擎的基准参考:实际情况是当前容器运行引擎可以选择的品类并不多,只有 Docker 家的组件是最容易搭建的,所以业界选型的时候,都是默认首选以 Docker 组件作为基准来选型环境配置。
多租户资源有效利用和资源控制:Kubernetes 无疑是最佳的开源项目来支撑云平台的实践。Kubernetes 的架构设计是声明式的 API 和一系列独立、可组合的控制器来保证应用总是在期望的状态。
容器网络选择:容器引擎是基于单机的容器管理能力,网络默认是基于 veth pair 的网桥模式。
容器存储是容器应用持久化问题:从容器提出来之后,业界就一直在探索如何在分布式场景下对接一套分布式存储来支撑有状态应用。
容器云平台定制化需求:云平台常常只覆盖底层组件80%左右的功能映射,并不是完全100%匹配。通用型云平台的设计实现需要从各家的场景需求出发。
镜像仓库的建设和管理:镜像仓库的扩展需求还是非常多的,比如和 CI/CD 的集成。
非功能的需求也是需要考虑:比如云平台的高可用怎么实现,是需要考虑清楚的。
微服务对服务网格化的需求:微服务尤其是 Google Istio 的推出对服务网格化的需求,给容器云平台注入了新的实际的微服务场景。
Docker 的 DevOps 实践方案,是一套灵活简单的敏捷解决方案。它克服了之前集群工具复杂、难用的困境,使用统一的 Docker 应用容器概念部署软件应用。通过引入 Docker 技术,开发团队在面对复杂的生产环境中,可以结合自己团队的实际情况,定制出适合自己基础架构的开发测试运维一体化解决方案。
转载地址:http://nohfk.baihongyu.com/