Docker Workflow(三):编排工具

本文讲的是Docker Workflow(三):编排工具,【编者的话】要在生产环境中发挥Docker的威力,离不开编排工具的支持,否则将深陷容器监控与管理困难的泥沼。目前市面上有不少此类工具,如何选择最合适的一个,本文给出了一些参考。

这是关于我们如何在IIIEPE的生产环境中使用Docker的系列文章的第三部分。如果你还没看过第一译文)和第二译文)部分,请先前往阅读再继续。本文中,我将讨论我们测试过的编排工具,我们的选择及原因。我也会说明我们如何使用Jenkins来处理繁重的工作,以及它的组织方式。

使用Docker真的非常酷,它解决了我们工作流中的多个问题,但也制造了一些问题。管理容器的工作量与管理虚拟机相比只多不少,如果你没使用编排工具来完成这件事,那你就错了。一旦容器数量开始增长,将真的很难管理。

我们在Docker Hub上开源的所有基础镜像都使用了Supervisor。Supervisor是个管理进程的美妙工具,如果一个进程死亡,supervisor就会重启它。因为Docker工作的方式,容器需要有一个进程处于运行状态,以保持容器存活。进程无法后台化,如果进程死亡,容器也会死亡,你就不得不想办法重启容器。这大概是你一开始就想避免的问题。Supervisor最棒的一点是它可以处理多个进程,因此一个运行PHP应用的容器将运行PHP-FPM、Nginx和Sendmail。

编排工具

我们大概花了两周时间针对一系列的编排方案进行了测试。包括:

  • Deis
  • Shipyard
  • Panamax
  • Kubernetes
  • Tsuru.io
  • Decking.io
  • Maestro-ng

我不想对每个方案做详尽回顾,这里只是简述一下。

Deis

使用Docker的PasS方案。基本上就是Heroku加上Docker。安装简单,但在存储方面不够灵活。这是最有吸引力的方案,但由于我们使用了Drupal,它不适合我们。而且,它没提供UI。

Shipyard

我们最终使用了Shipyard,但只是作为一个查看器。Shipyard还在不断发展,它最大的问题是没有办法简单的自动管理容器。正如我所说,我们仅仅把它作为一个查看器,用来监控所有容器和Docker服务的状态。如果一个容器崩溃了,我们只需要使用Shipyard重启死亡的容器,而不用重启该应用的所有容器。

Panamax

它很有前途,但在我们需要时还不完善。它还大量依赖于某些我个人很不喜欢的模板。缺少代理是我们测试时的一个主要障碍。基本上,没有代理我们就只能在每台服务器上安装Panamax。

Kubernetes

PaaS方案,列表中最难安装和配置的一个。它拥有很多超过我们要求的功能,但缺少一个我们需要的功能:Kubernetes不处理存储。

Tsuru.io

PaaS方案,它声称:

... Amazon S3 ... 是保存内容文件到tsuru的正确方法。

读完这段话,我们都连安装的欲望都没了。

Decking.io

作为Fig的替代品之一,没有多主机能力是最大的问题。

Maestro-NG

Maestro-NG在几个方面胜出:容易使用、有一个带简单命令的命令行界面、支持多主机、所有东西都在一个YAML文件中描述。

我们安装了一台服务器,并在上面安装了Maestro-NG,因为我们需要在每个web节点上打开Docker端口,为安全着想,只有Maestro-NG可以连接Docker。然后,我们将所有maestro文件组织进一个单独的git项目。项目下是一些以应用的正式域名(FQDN)命名的目录,在每个目录里有一个单独的文件,一个maestro.yaml文件:

/subdomain.example.com/maestro.yaml
/another-example.example.com/maestro.yaml

如果我们需要测试某个具体项目(我们并不会做这类测试),只需要创建一个maestro文件并推送上去,然后我们就可以像其他项目一样对待它。

使用Maestro-NG,我们的持续交付流程缩减成两个单独命令:

maestro pull ; maestro restart

由于做这个有点费时,我们就让Jenkins来替我们完成。

Jenkins

此前我们没使用Jenkins,因此我们也没实践过持续集成(CI)和持续交付(CD),一切都是手工的,非常容易出错。创建一个新的工作流是将其加入的绝好机会。

我们所有项目都具有相同的工作流:

  1. GitLab检测到推送
  2. GitLab触发一个web hook,并要求Jenkins启动一个新任务
  3. Jenkins克隆项目的最新版本
  4. Jenkins运行测试
  5. 如果测试通过,Jenkins开始构建新的docker镜像
  6. 镜像构建完成后,Jenkins将其推送到私有registry
  7. Jenkins通过SSH连接Maestro-NG服务器,并运行命令maestro pull ; maestro restart

对于未经测试的小项目,整个过程持续不到2分钟,有些项目甚至更快,在25到35秒之间。最大的一个项目,是一个会被推送到Docker Hub的公共项目,花费了大概6分钟。确实有个例外,项目构建花了18-20分钟,这是一个老旧的HTML网站,具有大量的视频和大尺寸文件,整个项目大概有1.8GB大小,因此构建时间非常久。

在开始配置所有需要的虚拟机时,我们决定将Jenkins和Docker Registry安装在同一台虚拟机上。这么做有两个原因:一是这台虚拟机拥有大量空间,完全满足二者要求,我们的web节点都比较小,这台虚拟机相对而言大得多;二是将Docker registry和Jenkins安装在同一台虚拟机上可以减少推送镜像到registry的传输时间。这对我们来说很有效。

Jenkins任务

对于正常的、未经测试的应用,Jenkins运行以下脚本任务:

docker build —tag=our-private-docker-registry/application_name --no-cache .
docker login --username="someusername" --password="somepassword" --email="someemail" https://our-private-docker-registry.fqdn
docker push our-private-docker-registry/application_name

对于测试过的应用,Jenkins会进行如下操作:

make prepare-test
sleep 90
make install
make test
make clean-test
docker build --tag=iiieperobot/dashi3 .
docker login --username="iiieperobot" --email="someemail" --password="somepassword"
docker push iiieperobot/dashi3

在上述示例中,我们直接推送到Docker Hub,但99%的任务是推送到私有Docker Registry。

脚本运行后,Jenkins会通过SSH连接Maestro-NG服务器,并运行:

cd /path_to_maestro/application_fqdn ; maestro pull ; maestro restart

重新构建基础镜像

当新的基础镜像被重新构建,我们需要重新构建依赖该基础镜像的所有镜像,因此对于每个基础镜像还有这样一个任务:

docker pull iiiepe/nginx-drupal

我们有一个构建后的动作来构建依赖此镜像的所有项目。

测试

在写作中途,我被问及是否在测试项目时使用Docker。猜的没错,需要时我们就会用。有时我们不使用模拟方式(mocking)而是对数据库进行测试,在进行这类测试时,我们会使用我上面描述的步骤,同时为了简化操作,我们使用了Makefiles,因此Jenkins和开发人员都可以通过make test来运行测试。

本文先到此为止,在下一篇同时是最后一篇文章中,我将讲述服务发现和负载均衡。

原文链接:A production ready Docker workflow. Part 3: Orchestration tools(翻译:梁晓勇 校对:郭蕾)

原文发布时间为:2015-03-31

本文作者:sean

本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。

原文标题:Docker Workflow(三):编排工具

时间: 2024-09-30 14:33:51

Docker Workflow(三):编排工具的相关文章

内置编排工具且适用于生产环境的Docker 1.12 GA了!

本文讲的是内置编排工具且适用于生产环境的Docker 1.12 GA了![编者的话]对于Docker来说,内置适用于生产环境的编排工具是件大事情.本文介绍了该内嵌编排工具的拓扑机构以及管理节点与工作节点之间通信的协议,并对该版本的内容进行总结,分别为容错.规模与性能.安全. 我们感谢社区的每一位成员帮助我们顺利到达Docker1.12这个里程碑,这个版本已经为生产环境做好了准备.1.12版本是自Docker项目开始以来特性增加最大也是最先进的一个版本.包括Docker员工和外部贡献者在内的数十位

如何基于编排工具打造可扩展的容器环境

由Docker引领先锋,容器在过去的一年里得到了飞速发展.容器技术提供了组件化环境,帮助应用在云之间轻松迁移而无需显著的返工.当谈到构建云以及非云的应用时,容器的战斗口号是可移植性和简单性. 随着容器在企业持续获得发展,厂商将增加新的功能让用户可以创建可扩展的基于容器的环境,这些功能很大程度上都集中于容器编排上. 容器编排工具提供调度和集群的技术,提供用于基于容器应用可扩展性的基本机制.这些工具使用容器服务,并编排他们以决定容器之间如何进行交互.此外,编排允许容器可以存在并执行在集群上,这使得他

Docker 1.6发布:Engine与编排工具更新、Registry 2.0及Windows客户端预览

本文讲的是Docker 1.6发布:Engine与编排工具更新.Registry 2.0及Windows客户端预览,[编者的话]Docker 1.6版本发布了,一同发布新版本的还有Registry 2.0.Compose.Swarm.Machine以及Docker Windows客户端,这次的变更很赞,值得一试! 我们很高兴来宣布对Docker Engine.Registry.Compose.Swarm和Machine的更新.我们将它们同时发布,因此你可以一起测试,同时可以承载多个跨工具的特性.

Docker编排工具Fig介绍

本文讲的是Docker编排工具Fig介绍,[编者的话]Fig是一个基于Docker的用于快速搭建开发环境的工具,目前Fig团队已经加入Docker公司.Fig通过一个配置文件来管理多个Docker容器,非常适合组合使用多个容器进行开发的场景.Fig可以和Docker一起来构建基于Docker的复杂应用.本文详细介绍了Fig的安装以及使用. 什么是编排? 编排(译者注:Orchestration,翻译为编排)是指同时管理多个容器的行为.当你刚开始玩Docker的时候,你只需要操作一个容器.紧接着你

简单的Docker编排工具TOSCA

时下Docker编排工具一瞥 从<Docker orchestration>这篇有趣的文章中,我们要思考为什么需要编排工具?基本的前提是,编排工具扮演了创建基于应用的容器及其层依赖的时间编排的角色,也就是使容器之间能够通信.彼此可以传递运行期的属性.在此我们更深入地探讨这篇文章的观点. 今日,尚无关于容器作为可移植的部署单位的讯息.但是,通常应用由多个容器构建会增加复杂度.而且,由多个Docker镜像组建集群的方式颇为笨重,因为这需要让容器感知其他容器的存在并暴露内部信息给其需要通信的容器.这

Docker 1.8:可信镜像、Toolbox、Registry 以及编排工具大更新

本文讲的是Docker 1.8:可信镜像.Toolbox.Registry 以及编排工具大更新,[编者的话]1.7 发布不到一个月 1.8 就重磅来袭.生产.生产还是生产,Docker 为了让自己能更适应生产环境进行了加速奔跑,我们也需要紧随技术的步伐不断前进. 我们很高兴的宣布 Docker 1.8 的发布,最新的版本包含了对镜像签名的支持,新的安装器以及 Engine.Compose.Swarm.Machine 以及 Registry 的多项改进. 你们过去总是和我们说想要一个扩展性更好的

Docker 开源集群管理和容器编排工具 SwarmKit

最近Docker公司开源了Docker集群管理和容器编排工具SwarmKit,其主要功能包括节点发现.基于raft算法的一致性和任务调度等. 基本概念 服务器上运行SwarmKit工具的swarmd命令后,即可将其加入到服务器集群中,该服务器就成为集群中的一个节点.SwarmKit将节点分为两类: 工作节点负责通过执行器运行任务.SwarmKit的默认执行器为Docker容器执行器(Docker Container Executor); 管理节点负责接收和响应用户的请求,将集群状态调节成最终状态

Netflix Conductor:一个微服务编排工具

本文讲的是Netflix Conductor:一个微服务编排工具[译者的话]这篇文章介绍了Netflix Conductor,一个微服务编排工具,为微服务执行复杂业务流程提供了一种思路,希望对读者有一定的启发. [深圳站|3天烧脑式Kubernetes训练营]培训内容包括:Kubernetes概述.架构.日志和监控,部署.自动驾驶.服务发现.网络方案等核心机制分析,进阶篇--Kubernetes调度工作原理.资源管理及源码分析等. Netflix内容平台工程团队运行许多业务流程,这些业务流程是通

【转载】详解Docker 最低特权编排原则,安全与效率并行!(一)

写在前面 Docker 平台和容器已经逐渐成为打包.部署和管理应用程序的标准.为了让容器在集群中于多节点间协调运行,这就需要一个关键的功能:容器编排(container orchestrator).本主题将分两篇为大家详细讲解这一重要功能.下篇<详解Docker 最低特权编排原则,安全与效率并行!(二)>链接为:https://yq.aliyun.com/articles/228215 编排功能 编排功能(Orchestrators)负责关键的集群和调度任务,例如: 管理容器调度和资源分配 支