持续交付系列(二):使用Docker、Mesos实现持续交付

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文讲的是持续交付系列(二):使用Docker、Mesos实现持续交付,【编者的话】本文主要介绍Mesos和Marathon的搭建以及如何完成整个持续交付过程,以及后续还可以做哪些改进和加强。整个系统搭建完成后,应用代码的改变会自动触发Jenkins构建流程,几秒钟后,改变就会通过Jenkins、D...
本文讲的是持续交付系列(二):使用Docker、Mesos实现持续交付 【编者的话】本文主要介绍Mesos和Marathon的搭建以及如何完成整个持续交付过程,以及后续还可以做哪些改进和加强。整个系统搭建完成后,应用代码的改变会自动触发Jenkins构建流程,几秒钟后,改变就会通过Jenkins、Docker Hub和Marathon传递到Mesos中部署上线,是不是很酷?

第一部分 中文翻译 )我们介绍了如何Docker化一个Node.js应用,如何使用Fig部署Jenkins和Docker Registry,以及如何实现Node.js应用的持续集成。

本文是第二部分,将继续介绍Mesos和Marathon的搭建以及如何完成整个持续交付过程。

15.02_.11_diagram3_.jpg

如果你不了解Mesos或者Marathon,可以参考如下文章: 文章1 文章2 文章3

现在,我们有了功能性开发和持续集成的环境,可以开始搭建Mesos集群了。

如下是包含系统所有部分的 fig.yml 文件。在之前配置好的Jenkins和Docker Registry基础之上,我们还有Mesos master、Mesos slave、Mesosphere Marathon和负责内部Mesos通信的Zookeeper。
# Zookeeper: -p 2181:2181 -p 2888:2888 -p 3888:3888
zookeeper:
image: jplock/zookeeper:3.4.5
ports:
- "2181"
master:
image: redjack/mesos-master:0.21.0
hostname: master
links:
- zookeeper:zookeeper
environment:
- MESOS_ZK=zk://zookeeper:2181/mesos
- MESOS_QUORUM=1
- MESOS_WORK_DIR=/var/lib/mesos
- MESOS_LOG_DIR=/var/log
ports:
- "5050:5050"
marathon:
#image: garland/mesosphere-docker-marathon
image: mesosphere/marathon
links:
- zookeeper:zookeeper
ports:
- "8080:8080"
# this image does not respect MARATHON_ env variables, so adding the params via command
command: --master zk://zookeeper:2181/mesos --zk zk://zookeeper:2181/marathon
slave:
image: redjack/mesos-slave:0.21.0
links:
- zookeeper:zookeeper
- master:master
environment:
- MESOS_MASTER=zk://zookeeper:2181/mesos
- MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins
- MESOS_CONTAINERIZERS=docker,mesos
- MESOS_ISOLATOR=cgroups/cpu,cgroups/mem
- MESOS_LOG_DIR=/var/log
volumes:
- /var/run/docker.sock:/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /sys:/sys:ro
- mesosslace-stuff:/var/log
expose:
- "5051"
jenkins:
image: containersol/jenkins_with_docker
links: 
- marathon:marathon
volumes:
- jenkins-stuff:/var/jenkins_home
- .:/var/jenkins_data
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports: 
- "8081:8080"
registry:
image: registry
environment:
- STORAGE_PATH=/registry
volumes:
- registry-stuff:/registry
ports: 
- "5000:5000"

fig.yml 不多做解释。所有环境参数都是参考Docker Hub上对应镜像的使用介绍。

Mesos slave容器还使用了挂载socket的技巧,不过不需要做别的,因为slave是用root用户运行的,有访问socket的权限。

要注意Jenkins容器连接到了Marathon。这就要求能够从Jenkins容器发送请求到Marathon容器里。我们在下一章介绍部署的时候会详细说明。

现在重启系统,可以看到系统开始运行:
$ fig up
Creating cddemo_registry_1...
Recreating cddemo_zookeeper_1...
Creating cddemo_master_1...
Creating cddemo_slave_1...
Recreating cddemo_marathon_1...
Creating cddemo_jenkins_1...

容器启动非常快,但是要等所有服务都上线大概花了30秒(在MacBook Air上的Ubuntu虚拟机里)。

Mesos在 http://localhost:5050 。如下截图里可以看到一个活动的slave。该slave在本次配置下没有暴露任何端口。
Screen-Shot-2015-02-28-at-18.08_.56_.png

http://localhost:8080 可以访问Marathon。
Screen-Shot-2015-02-28-at-18.09_.14_.png

部署

最后一步是将我们用Marathon在Mesos上新构建的Docker镜像部署好。
15.02_.11_diagram4_.jpg

首先需要创建配置文件将应用安排到Marathon上,如下 app_marathon.json :
{
"id": "app", 
"container": {
  "docker": {
    "image": "localhost:5000/containersol/nodejs_app:latest",
    "network": "BRIDGE",
    "portMappings": [
      {"containerPort": 8000, "servicePort": 8000}
    ]
  }
},
"cpus": 0.2,
"mem": 512.0,
"instances": 1
}

这里也有一些需要注意的地方。比如,没有提到健康检查,需要告诉Marathon应用运行和不运行的时间。

一旦我们发布了这个JSON文件,就可以在 deploy.sh 里添加最新的脚本,移除最近运行的应用,并且用新的镜像重新部署它。当然有更好的升级策略,不过不在这里讨论。
#!/bin/bash

if [ -z "${1}" ]; then
version="latest"
marathon="localhost"
else
version="${1}"
marathon=${MARATHON_PORT_8080_TCP_ADDR}
fi

# destroy old application
curl -X DELETE -H "Content-Type: application/json" http://${marathon}:8080/v2/apps/app 

# I know this one is ugly. But it works for now.
sleep 1

# these lines will create a copy of app_marathon.json and update the image version
cp -f app_marathon.json app_marathon.json.tmp
sed -i "s/latest/${version}/g" app_marathon.json.tmp

# post the application to Marathon
curl -X POST -H "Content-Type: application/json" http://${marathon}:8080/v2/apps -d@app_marathon.json.tmp

最后一步是将 deploy.sh 添加到Jenkins的配置中并运行构建。
Screen-Shot-2015-02-28-at-19.18_.17_.png

成功构建之后,可以看到应用运行在Marathon上:
Screen-Shot-2015-02-28-at-19.21_.59_.png

http://localhost:31000 可以访问我们自己的应用:
Screen-Shot-2015-02-28-at-19.23_.29_.png

现在可以试着改变应用并且触发Jenkins去构建build。几秒钟后,这个改变就会通过Jenkins、Docker Hub和Marathon传递到Mesos里!

改进

要想改进这个系统有两个大方向:添加更多的功能以及提升搭建质量(deepening the quality of the setup)。可能的扩展有很多,我们只列了几个例子:
  • 将HelloWorld示例扩展为一个标准Web应用
  • 多语言支持
  • 多层次的自动化测试(单元测试、系统测试、性能测试等等。)
  • 用Git hook自动触发Jenkins build
  • 部署到公有云里,比如GCE、AWS等
  • 在多主机上运行
  • HAProxy搭建
  • 用Jmeter实现负载模拟下的自动扩展
  • 部署一个基于微服务的系统
  • 使用Flocker做持久化存储
  • 使用Weave作为网络容器
  • 使用Consul实现自动服务发现
  • 添加系统监控
  • 添加集中式日志

我的下一步想使系统可以面向外部用户,添加HAProxy和自动扩展的能力,如下图所示:
15.02_.11_diagram5_.jpg

最后的话

一开始搭建这个系统主要是想帮助开发和运维人员学习如何在持续交付领域使用Docker和Mesos。在几个月的过程中我发现完整的系统很复杂,很难解释,更难搭建和使用。
我们请 Marta marszal 创建了本文的图表,以让文章更容易理解。

如果有改进本示例系统的建议,请一定告诉我们。本文的图表也可以随意下载和使用,不过请注明出处。 CD_with_Mesos_Docker

所有资源都可以在 GitHub 上找到。
===========================
译者介绍
崔婧雯,现就职于VMware,高级软件工程师,负责桌面虚拟化产品的质量保证工作。曾在IBM WebSphere业务流程管理软件担任多年系统测试工作。对虚拟化,中间件技术有浓厚的兴趣。

原文链接:Continuous Delivery with Docker on Mesos in less than a minute – Part 2(翻译:崔婧雯 校对:李颖杰)

原文发布时间为:2015-03-11
本文作者:崔婧雯
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:持续交付系列(二):使用Docker、Mesos实现持续交付
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
Kubernetes Linux Docker
使用阿里云vpc 路由表实现Docker容器跨主机通讯。
使用阿里云vpc 路由表实现Docker容器跨主机通讯。
|
消息中间件 负载均衡 调度
Docker swarm实现基于Consul和Haproxy的RabbitMQ高可用集群
基于Consul服务发现和Haproxy实现的RabbitMQ高可用的负载均衡集群
|
消息中间件 存储 负载均衡
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
630 0
RabbitMQ使用docker搭建集群并使用Haproxy实现负载均衡(多机镜像模式)
|
Kubernetes 调度 Apache
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
Docker 编排工具比较:Kubernetes、Docker Swarm 和 Mesos,选择最适合你的容器编排方案
372 0
|
分布式计算 Ubuntu Hadoop
Hadoop生态系统中的云计算与容器化技术:Apache Mesos和Docker的应用
Hadoop生态系统中的云计算与容器化技术:Apache Mesos和Docker的应用
|
Kubernetes jenkins 测试技术
基于容器的持续交付:使用Jenkins和Docker构建流水线
在当今软件开发的快节奏环境中,持续交付已经成为一种不可或缺的开发实践。它允许开发团队以更快的速度交付高质量的软件,同时保持灵活性和可靠性。在本文中,我们将介绍如何使用Jenkins和Docker构建基于容器的持续交付流水线,以实现自动化的构建、测试和部署过程。
479 0
|
持续交付 Docker 容器
《应用Docker进行持续交付:用技术改变交付路程》电子版地址
应用Docker进行持续交付:用技术改变交付路程
68 0
《应用Docker进行持续交付:用技术改变交付路程》电子版地址
|
存储 数据可视化 Java
SpringBoot应用整合并使用Docker安装ELK实现日志收集
SpringBoot应用整合并使用Docker安装ELK实现日志收集
SpringBoot应用整合并使用Docker安装ELK实现日志收集
|
持续交付 Docker 容器
《像搭积木一样玩转Docker的持续交付》电子版地址
像搭积木一样玩转Docker的持续交付
67 0
《像搭积木一样玩转Docker的持续交付》电子版地址