This commit is contained in:
by931
2022-09-06 22:30:37 +08:00
parent 66970f3e38
commit 3d6528675a
796 changed files with 3382 additions and 3382 deletions

View File

@@ -115,7 +115,7 @@ function hide_canvas() {
<p>敏捷开发已经流行了很长时间,如今有越来越多的传统企业开始践行敏捷开发所提倡的以人为中心、迭代、循序渐进的开发理念。</p>
<p>在这样的场景下引入 Docker 技术,首要目的就是使用 Docker 提供的虚拟化方式,给开发团队建立一套可以复用的开发环境,让开发环境可以通过 Image 的形式分享给项目的所有开发成员,以简化开发环境的搭建。但是,在没有 Docker 技术之前就已经有类如 Vagrant 的开发环境分发技术软件开发者一样可以创建类似需求的环境配置流程。所以在本地开发环境方面Docker 技术的优势并不能很好的发挥出来。笔者认为 Docker 的优点在于通过简化CI持续集成、CD持续交付的构建流程让开发者把更多的精力用在开发上。</p>
<p>每家公司都有自己的开发技术栈,我们需要结合实际情况对其进行持续改进,优化自己的构建流程。当我们准备迈出第一步时,我们首先要确立一张构建蓝图,做到胸有成竹,这样接下来的事情才会很快实现。</p>
<p><img src="assets/b6e6c5c0-b957-11e7-9ef0-6d5a49ce73be" alt="enter image description here" /></p>
<p><img src="assets/b6e6c5c0-b957-11e7-9ef0-6d5a49ce73be" alt="png" /></p>
<p>这张时序图概括了目前敏捷开发流程的所有环节。结合以上时序图给出的蓝图框架,本文的重点是讲解引入 Docker 技术到每个环节中的实践经验。</p>
<h3>组建持续发布的敏捷团队</h3>
<p>开发团队在引入 Docker 技术的时候,最大的问题是没有可遵循的业界标准。大家常常以最佳实践为口号,引入多种工具链,导致在使用 Docker 的过程中没有侧重点。涉及到 Docker 选型,又在工具学习上花费大量时间,而不是选用合适的工具以组建可持续发布产品的开发团队。基于这样的场景,我们可以把“简单易用”的原则作为评判标准,引入到 Docker 技术工具选型的参考中。开发团队在引入 Docker 技术的过程中,首先需要解决的是让团队成员尽快掌握 Docker 命令行的使用。在熟悉了 Docker 命令行之后,团队需要解决几个关键问题具体如下:</p>
@@ -135,12 +135,12 @@ function hide_canvas() {
<h3>持续集成的构建系统</h3>
<p>当开发团队把代码提交到 Git 应用仓库的那一刻,我相信所有的开发者都希望有一个系统能帮助他们把这个应用程序部署到应用服务器上,以节省不必要的人工成本。但是,复杂的应用部署场景,让这个想法实现起来并不简单。</p>
<p>首先,我们需要有一个支持 Docker 的构建系统,这里推荐 <a href="https://jenkins-ci.org/">Jenkins</a>。它的主要特点是项目开源、方便定制、使用简单。Jenkins 可以方便的安装各种第三方插件,从而方便快捷的集成第三方的应用。</p>
<p><img src="assets/1f0293e0-b959-11e7-8135-c7543844927f" alt="enter image description here" /></p>
<p><img src="assets/1f0293e0-b959-11e7-8135-c7543844927f" alt="png" /></p>
<p>通过 Jenkins 系统的 Job 触发机制,我们可以方便的创建各种类型的集成 Job 用例,但缺乏统一标准的 Job 用例使用方法,会导致项目 Job 用例使用的混乱,难于管理维护,这也让开发团队无法充分利用好集成系统的优势,当然这也不是我们期望的结果。所以,敏捷实践方法提出了一个可以持续交付的概念 <a href="http://martinfowler.com/bliki/DeploymentPipeline.html">DeploymentPipeline</a>管道部署。通过Docker 技术,我们可以很方便的理解并实施这个方法。</p>
<p>Jenkins 的管道部署把部署的流程形象化成为一个长长的管道,每间隔一小段会有一个节点,也就是 Job完成这个 Job 工作后才可以进入下一个环节。形式如下:</p>
<p><img src="assets/52423cb0-b959-11e7-b6a8-55aac7678b95" alt="enter image description here" /></p>
<p><img src="assets/52423cb0-b959-11e7-b6a8-55aac7678b95" alt="png" /></p>
<p>大家看到上图中的每一块面板在引入 Docker 技术之后,就可以使用 Docker 把任务模块化,然后做成有针对性的 Image 用来跑需要的任务。每一个任务 Image 的创建工作又可以在开发者自己的环境中完成,类似的场景可以参考下图:</p>
<p><img src="assets/707f2c60-b959-11e7-9ef0-6d5a49ce73be" alt="enter image description here" /></p>
<p><img src="assets/707f2c60-b959-11e7-9ef0-6d5a49ce73be" alt="png" /></p>
<p>所以,使用 Docker 之后,任务的模块化很自然地被定义出来。通过管道图,可以查看每一步的执行时间。开发者也可以针对任务的需要,为每一个任务定义严格的性能标准,已作为之后测试工作的参考基础。</p>
<h3>最佳的发布环境</h3>
<p>应用经过测试接下来我们需要把它发布到测试环境和生产环境。这个阶段中如何更合理地使用Docker 也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。其实,这个环境就是基于 Docker 的私有云,更进一步我们可能期望的是提供 API 接口的 PaaS 云服务。为了构建此 PaaS 服务,这里推荐几款非常热门的工具方便大家参考,通过这些工具可以定制出企业私有的 PaaS 服务。</p>
@@ -153,12 +153,12 @@ function hide_canvas() {
<li>The Kubernetes Node计算节点通过自维护的策略来保证主机上服务的可用性当集群控制面板发布指令后也是异步通过 etcd 来存储和发布指令,没有集群控制链路层面的依赖。</li>
</ol>
<p>通过官方<a href="https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md.html">架构设计</a>文档的介绍,可以详细的了解每个组件的设计思想。这是目前业界唯一在生产环境部署经验的基础上推出的开源容器方案,目前是 CNCF 推荐的容器管理系统的行业参考标准。</p>
<p><img src="assets/9d195dd0-b95a-11e7-8135-c7543844927f" alt="enter image description here" /></p>
<p><img src="assets/9d195dd0-b95a-11e7-8135-c7543844927f" alt="png" /></p>
<ul>
<li>Docker swarmkit</li>
</ul>
<p>SwarmKit 是一个分布式集群调度平台作为docker 一个新的集群调度开源项目,它大量借鉴了 Kubernetes 和 Apache Mesos 的优秀概念和最佳实践,通过内嵌到 docker daemon 中实现对开发用户的引入。实际上它可以被看做 Docker Swarm 的2.0版本。目前业界云原生应用基金会并没有收录此集群方案,所以开发者在选型时会慎重考虑。</p>
<p><img src="assets/27150160-b95b-11e7-8135-c7543844927f" alt="enter image description here" /></p>
<p><img src="assets/27150160-b95b-11e7-8135-c7543844927f" alt="png" /></p>
<ul>
<li>Apache Mesos + Marathon(DCOS)</li>
</ul>
@@ -183,7 +183,7 @@ function hide_canvas() {
<p>然后调用</p>
<p>curl -X POST -H &quot;Content-Type: application/json&quot; http://:8080/v2/apps <a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="99b4fdd9ddf6faf2fcebb7f3eaf6f7">[email&#160;protected]</a></p>
<p>我们就可以创建出一个 Web 服务在 Mesos 集群上。对于 Marathon 的具体案例,可以<a href="https://mesosphere.github.io/marathon/">参考官方案例</a></p>
<p><img src="assets/7af50550-b95b-11e7-92cf-9f8c21d336ab" alt="enter image description here" /></p>
<p><img src="assets/7af50550-b95b-11e7-92cf-9f8c21d336ab" alt="png" /></p>
<h3>结论</h3>
<p>Docker 的 DevOps 实践方案,是一套灵活简单的敏捷解决方案。它克服了之前集群工具复杂、难用的困境,使用统一的 Docker 应用容器概念部署软件应用。通过引入 Docker 技术,开发团队在面对复杂的生产环境中,可以结合自己团队的实际情况,定制出适合自己基础架构的开发测试运维一体化解决方案。</p>
</div>