Docker与Traefik助微服务腾飞

本文讲的是Docker与Traefik助微服务腾飞【编者的话】Govind Fichtner是一位从业15年的德国IT老兵。先后担任过开发工程师、系统管理员、咨询师、架构师、敏捷训练师、项目经理、部门经理甚至CTO。白天他是一位勤奋的DevOps,晚上则变身为狂热的ARM设备爱好者。他现在为Hypriot成员,该组织成员以“Docker海盗”自称,发布了多款ARM架构中的Docker应用。他们的身上完美的体现了Geek精神。

几周之前我发现了一款叫做Tradefik的小而美的HTTP反向代理。它可以作为一款为动态后端服务的前端代理,这个动态后端可以是Docker。

你发现了这个动态特性的重要性了吗?

Traefik真正与众不同的特点是,它能通过监听Docker事件来增加或移除容器后端服务。所以当一个Docker容器启动或停止时,Traefik都可以知道这个情况并能将将容器添加到它的活动后端服务列表中。

有了这个能力Traefix可以取代Nginx或者HAProxy,因为后者需要非常复杂的操作步骤且需要诸如RegistratorConsulConsul-Template等工具来完成相同的功能。

所以让我向你展示一个小例子来说明开始使用Traefik是多么简单的事情...

你能看到下面的架构图中我们有一个简单的HTTP服务来响应请求。

我们有多个后端服务,因为要做高可用和负载均衡,它们运行在多个物理节点上。Traefik作为前端代理将请求均匀分发给可用的后端服务上。

Traefik同时作为一个后端服务运行在Docker Swarm集群中的容器内。在这个例子中每个后端服务将会响应所在的独立的容器ID,以此来区分到底是哪个服务做出的响应。

在开始之前我们需要运行一套Docker Swarm集群。

创建Docker Swarm集群

一个最快速并且便捷地得到一套Docker Swarm集群的方法是使用我们的Hypriot Cluter Lab

因为Cluster Lab已经预装在树莓派操作系统HypriotOS的“Barbossa”发行版中,我将向你展示怎样使用它去设置Swarm集群。

为了能跟上我的操作,你至少需要三台树莓派主机。我将会使用具有五个节点的Pico-Cluster。

第一步是将HypriotOS镜像烧录到SD中。
将Hypriot仓库克隆到你作为烧录机的操作系统中合适的目录里。

$ git clone https://github.com/hypriot/flash.gi://github.com/hypriot/flash.git
$ cd flash/Darwin

使用flash命令,我们可以为我们的主节点准备好SD卡。

$ ./flash --hostname cl-leader https://downloads.hypriot.com/hypriotos-rpi-v0.8.0.img.zip

为从节点重复此过程。

$ for i in {1..4} do; ./flash --hostname cl-follower${i} https://downloads.hypriot.com/hypriotos-rpi-v0.8.0.img.zip; done

当从节点还在烧录时,你就可以启动主节点了。

SSH到主节点并切换到root用户:

$ ssh pirate@cl-leader.local
$ sudo su

为了能使Cluster Lab与Traefik进行工作,我们需要升级它到最新版本:

$ apt-get update
$ apt-get install hypriot-cluster-lab=0.2.13-1

然后启动Hypriot Cluster Lab,并使用verbose参数来启用日志输出功能:

$ VERBOSE=true cluster-lab start

当Cluster Lab启动,你能观察到它是如何自我配置和进行自检的。如果所有步骤不是绿的,你可以停下它并重新启动。如果还是失败,你需要看一下错误指导部分

当主节点准备好后,是时候启动其他的从节点了,步骤也是先升级然后使用相同的方式启动Cluster Lab。现在你可以尝试做做看,当一切搞定后我们再继续。

好了,我们可以执行下面的命令检查我们是否已经有了五个健康的Swarm Cluster 节点:

DOCKER_HOST=tcp://192.168.200.1:2378 docker info | grep Nodes
Nodes: 5

瞧我们的集群中真的有了五个节点了。恭喜恭喜!

当你完成了以上的步骤,那么剩下的就是小菜一碟了!

使用Traefik组建我们的微服务

我们的微服务示例由两部分组成。Traefik前端和WhoAmI后端应用。对于这两部分我已经为你准备好了Docker镜像,你可以从Docker Hub中拉取到本地。

Traefik镜像叫做hypriot/rpi-traefik ,WhoAmI镜像叫做hypriot/rpi-whoami。两个镜像的Dockerfile可以在Github的相关仓库中找到。

因为这两个Dockerfile也是Go语言为基础的镜像的好示例,我将会在这里解释一下其中的内容。

“rpi-traefik”的Dockerfile:

FROM hypriot/rpi-alpine-scratch
RUN apk update &&\
apk upgrade &&\
apk add ca-certificates &&\
rm -rf /var/cache/apk/*
ADD https://github.com/containous/traefik/releases/download/v1.0.0-beta.771/traefik_linux-arm /traefik
RUN chmod +x /traefik
EXPOSE 80 8080
ENTRYPOINT ["/traefik"]

它表示我们刚刚在Alpine linux镜像之中增加了Traefik的可执行文件。这个镜像非常精巧仅仅只有41MB。如果你静态编译Traefik可执行文件到一个空镜像中,它的体积将会更小。

你将会在下面的WhoAmI镜像的Dockerfile中看到这是怎么做的:

“rpi-whoami”的Dockerfile:

FROM scratch

ADD http /http

ENV PORT 8000
EXPOSE 8000

CMD ["/http"]

仅仅只有3MB的镜像,这真是非常的小。

好了,现在是时候将组件放入一个Docker Compose应用中了。

克隆下面的仓库到你的集群主节点中:

$ git clone https://github.com/hypriot/rpi-cluster-lab-demos

当克隆结束后切换到‘traefik’目录,并使用Docker Compose在我们的微型Docker Swarm集群中启动我们的应用:

$ cd rpi-cluster-lab-demos/traefik
$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose up -d
Creating network "traefik_default" with the default driver
Creating traefik_traefik_1
Creating traefik_whoami_1

这些命令将会使Docker Compose启动两个容器。一个主节点中Traefik容器,另一个是在四个从节点中启动一个WhoAmI容器。

让我们查看一下是否真是如此:

$ DOCKER_HOST=tcp://192.168.200.1:2378 docker ps | grep 'traefik\|whoami'
cba8d9a7d8f7        hypriot/rpi-whoami         "/http"                  About a minute ago   Up About a minute   8000/tcp                                                 cl-follower1/traefik_whoami_1
7dc2b48a24e2        hypriot/rpi-traefik        "/traefik --web --doc"   About a minute ago   Up About a minute   192.168.200.1:80->80/tcp, 192.168.200.1:8080->8080/tcp   cl-leader/traefik_traefik_1

看起来不错。那么让我们发送一些HTTP请求到前端来测试一下我们的应用:

$ for i in {1..5}; do curl -H Host:whoami.docker.localhost http://192.168.200.1; done
I'am f72892c9187c
I'am f72892c9187c
I'am f72892c9187c
I'am f72892c9187c
I'am f72892c9187c

正如你所见,所有的响应全部来自于同一个后端容器,并且这正是我所期望的。

接下来我们将会在Docker Compose scale命令的帮助下增加后端容器的数量。

$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose scale whoami=5
Creating and starting traefik_whoami_2 ... done
Creating and starting traefik_whoami_3 ... done
Creating and starting traefik_whoami_4 ... done
Creating and starting traefik_whoami_5 ... done

我们观察到Docker Compose通知Docker Swarm增加了更多的容器。

让我们再次检查一下是否现在已经有五个后端容器运行了:

$ for i in {1..5}; do curl -H Host:whoami.docker.localhost http://192.168.200.1; done
I'm 5d829fecbdaa
I'm 5eb115353885
I'm e0313ac24554
I'm 642b5d2c8d09
I'm f72892c9187c

非常好。很显然Traefik刚才识别出了我们已经启动了更多的容器并且使他们自动与前端相连。

我们能通过Traefik容器的日志观察到具体的执行过程:

$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose logs traefik
...
traefik_1  | time="2016-06-07T06:50:38Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami\":{\"servers\":{\"server-traefik_whoami_1\":{\"url\":\"http://10.0.0.3:8000\",\"weight\":1},\"server-traefik_whoami_2\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-traefik_whoami_3\":{\"url\":\"http://10.0.0.6:8000\",\"weight\":1},\"server-traefik_whoami_4\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1},\"server-traefik_whoami_5\":{\"url\":\"http://10.0.0.7:8000\",\"weight\":1 } } } },\"frontends\":{\"frontend-Host-whoami-docker-localhost\":{\"backend\":\"backend-whoami\",\"routes\":{\"route-frontend-Host-whoami-docker-localhost\":{\"rule\":\"Host:whoami.docker.localhost\"}},\"passHostHeader\":true} } }"
traefik_1  | time="2016-06-07T06:50:38Z" level=debug msg="Last docker config received less than 2s, waiting..."
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Waited for docker config, OK"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating frontend frontend-Host-whoami-docker-localhost"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Wiring frontend frontend-Host-whoami-docker-localhost to entryPoint http"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating route route-frontend-Host-whoami-docker-localhost Host:whoami.docker.localhost"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating backend backend-whoami"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating load-balancer wrr"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_4 at http://10.0.0.4:8000 with weight 1"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_3 at http://10.0.0.6:8000 with weight 1"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_2 at http://10.0.0.5:8000 with weight 1"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_1 at http://10.0.0.3:8000 with weight 1"
traefik_1  | time="2016-06-07T06:50:40Z" level=debug msg="Creating server server-traefik_whoami_5 at http://10.0.0.7:8000 with weight 1"

通过日志我们能清楚的看到Traefik是怎么获取Docker事件并作出反应的。

这难道不很帅吗?

好了。这就是我们的快速设置Docker和Traefik的简单微服务例子。

剩下唯一要做的就是再次清理容器。

$ DOCKER_HOST=tcp://192.168.200.1:2378 docker-compose down -v

你们注意到了“-v”参数了吗?这应该对清除所有的容器,包括overlay网络都非常的重要。没有“-v”参数,我们在下次使用Docker Compose启动应用的时候会产生一个错误。

在你关闭树莓派之前停止所有的节点中的Cluster Lab也是一个必要的步骤。

所以在所有节点上执行一下$ cluster-lab stop命令。

在这么短小的一篇博客中使用了这么多有趣的技术是非常棒的一件事情。并且使它们运行起来一点都不难,是不是?

这都归功于Hypriot Cluster Lab的功劳,当然Docker-Engine、Docker-Swarm和Docker-Compose也居功至伟。

所以一定要试试我们的Hypriot Cluster,并且尝试一下Hypriot Cluster Lab Demos仓库中的例子,或者添加一些你自己的例子。同时也欢迎大家提Pull request。

原文链接:Microservices Bliss with Docker and Traefik (翻译:高洪涛)

===========================================
译者介绍

高洪涛,当当网架构师,开源数据库分库分表中间件Sharding-JDBC作者。目前从事Docker相关研究工作。

原文发布时间为:2016-06-17

本文作者:高洪涛

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

原文标题:Docker与Traefik助微服务腾飞

时间: 2024-10-13 05:14:15

Docker与Traefik助微服务腾飞的相关文章

云上Docker的Spring Cloud微服务应用实践分享

本文整理自2017云栖大会-上海峰会中阿里云高级技术专家李荣陆的分享讲义,讲义主要介绍了云上Docker的Spring Cloud微服务应用实践的契机,过程,和对未来的展望.

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用(五)

服务智能路由 本文为阿里云容器服务Spring Cloud应用开发系列文章的第五篇,讨论如何利用Spring Cloud 对 Netflix Zuul支持,完成服务的职能路由功能. 一.在阿里云容器服务上开发Spring Cloud微服务应用 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由(本文) 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 使用Zuul构建简单API Gateway 在手机端完成一个功能有可能需要

在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四.服务间通信与集成 五.服务智能路由 六.集中配置管理 七.高可用和容错 八.监控和日志 九.服务的部署和发布策略 微服务概述 单体应用通常指在一个程序中满足多个业务或技术领域的需求,不同的需求领域内化为模块.假定我们要开发一个Web应用,通常的MVC模式可以满足要求.针对不同领域有不少代码生成工具

基于微服务和Docker容器技术的PaaS云平台架构设计

本文讲的是基于微服务和Docker容器技术的PaaS云平台架构设计[编者的话]在系统架构上,PaaS云平台主要分为微服务架构.Docker容器技术.DveOps三部分,这篇文章重点介绍微服务架构的实施. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.Kubernetes Storage机制.容器网络实现原理和模型.Docker网络实现.网络插件.

使用Spring Cloud和Docker构建微服务

本文讲的是使用Spring Cloud和Docker构建微服务,[编者的话]这是系列博文中的第一篇,本文作者使用Spring Cloud和Docker构建微服务平台,文章的例子浅显易懂. 本系列博文主要向大家介绍如何使用Spring Cloud和Docker构建微服务平台. 什么是Spring Cloud? Spring Cloud 是Pivotal提供的用于简化分布式系统构建的工具集.Spring Cloud引入了云平台连接器(Cloud Connector)和服务连接器(Service Co

中间件和微服务,Docker以及原生云架构的关系

微服务和Docker的发展势头 微服务和容器的主要目标是缩短软件开发时间,以及实现开发.部署以及运维的更大灵活性.为什么它过去几个月的发展势头这么猛?因为几乎所有科技巨头企业如亚马逊,谷歌,Facebook,Netflix都在这里激烈竞争. 微服务就像是一个面向服务的架构(SOA):这是一种架构和供应商技术分别独立的设计理念.因此,目前并没有明确的界定标准或规范.你永远需要在和其他人讨论之前定义你所理解的微服务术语.每个人都有不同的定义.在这篇文章中微服务是被开发,部署和独立缩放的服务.它们可以

微服务配置管理

标签 PostgreSQL , 微服务 , 配置管理 , UDF , 异步消息 , JSON , XML 背景 微服务的介绍,请参考 https://martinfowler.com/articles/microservices.html 不管是微服务,或者其他软件架构,docker等.APP(微服务)配置的同步,变更,下发,都是需要面对的. 例如你可以用消息队列,但是这种方式比较重,同时在APP重启后,可能还需要消费一部分消息(实际上重启后可以直接读取最新配置,不需要重新消费). 使用Post

视觉中国:基于容器云的同城双活微服务架构上云实践

本文正在参加"最佳上云实践"评选,来给我们投票吧:https://yq.aliyun.com/activity/158(编号7) 视觉中国集团(Visual China Group)创立于2000年6月,是中国领先的视觉影像产品和服务提供商.视觉中国集团是以"视觉创造价值,视觉服务中国"为愿景的A股唯一互联网文化创意上市公司(股票代号000681,股票简称:视觉中国).视觉中国集团以"视觉内容与服务"."视觉社区"和"

微服务架构的崛起

[编者按]Docker改变了应用程序开发领域的很多事情,已经成为时下最流行的开源项目之一,而且也从根本上改变了人们构建应用程序思维方式.Docker正在改变云的开发实践,允许任何人以整合别人容器的形式利用封装社区的最佳实践,这就像云组件的乐高玩具. 以下为译文: Docker就像一场森林大火,这个新的Linux容器技术以它自己的方式点燃了周围的一切,我们许多人难以跟上它蔓延的速度.Docker不仅是历史上最流行的开源项目之一,而且也从根本上改变了人们构建应用程序的思维方式. 严格来说,许多基于D