Docker与Traefik助微服务腾飞

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

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

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

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

architecture.png


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

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

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

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

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

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

创建Docker Swarm集群

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

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

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

第一步是将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助微服务腾飞

相关文章
|
1月前
|
Java Docker 微服务
如何使用Docker和Docker Compose部署微服务
【2月更文挑战第12天】
228 0
|
1月前
|
监控 持续交付 Docker
深入浅出:基于Docker的微服务部署实践
【2月更文挑战第26天】在当前软件开发领域,微服务架构与容器化技术成为提升应用可伸缩性、可靠性和开发效率的关键手段。本文将深入探讨如何利用Docker容器技术实现微服务的快速部署与管理,涵盖环境搭建、服务打包、网络配置及持续集成等核心话题。通过实例演示,旨在为开发者提供一套行之有效的微服务部署解决方案。
|
2月前
|
开发者 Docker 微服务
深入浅出:使用Docker容器化部署微服务架构
在当今快速迭代的软件开发环境中,微服务架构因其高度解耦和独立性而成为企业首选。然而,微服务的管理和部署可能会变得复杂和繁琐。本文将探讨如何利用Docker,一个轻量级的容器化技术,来简化和加速微服务的部署。我们将从Docker的基础概念入手,详细介绍如何创建、配置和运行微服务容器,最后讨论Docker在微服务架构中的优势和挑战。本文旨在为开发者提供一条清晰的路径,通过容器化技术实现微服务架构的高效部署和管理。
87 0
|
2月前
|
Kubernetes 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在当今快速演进的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理也带来了新的挑战。本文旨在通过深入浅出的方式,探讨如何利用Docker容器技术有效地部署和管理微服务架构。我们将从Docker的基本概念出发,逐步深入到如何构建、部署微服务,并讨论在此过程中可能遇到的常见问题及其解决策略。本文不仅适合刚接触Docker和微服务的新手,也为有经验的开发者提供了实用的参考。
56 1
|
2月前
|
JSON JavaScript Docker
深入浅出:使用Docker容器化部署微服务架构
本文旨在向读者展示如何利用Docker技术高效地构建和部署微服务架构。通过深入浅出的方式,我们将探索Docker的基本概念、容器化的优势以及如何将其应用于微服务架构中。此外,文章还将提供一个简单的示例,指导读者实践如何使用Docker将一个现有的后端应用容器化,并部署到本地开发环境中。不同于传统的摘要,这里我们强调实践操作的重要性,鼓励读者通过实际操作来加深对Docker和微服务架构的理解。
52 1
|
2月前
|
Kubernetes 负载均衡 Docker
深入浅出:使用Docker容器化部署微服务
在当今快速变化的软件开发领域,微服务架构因其高度的模块化和可伸缩性而受到广泛欢迎。然而,微服务的部署和管理带来了新的挑战。本文将探讨如何利用Docker容器技术,简化和加速微服务应用的部署过程。我们将从Docker的基础知识入手,逐步深入到如何构建、部署和管理微服务容器。通过本文,读者将获得一套实用的工具和方法论,以便在自己的项目中高效地应用Docker和微服务技术。
|
2月前
|
Java 开发者 Docker
深入浅出:使用Docker容器化部署微服务架构
在本文中,我们将探索Docker容器技术如何革新微服务架构的部署方式,提高开发效率和应用的可扩展性。不同于传统摘要的概述风格,我们将通过一个实际案例,步骤明晰地展示如何将一个简单的微服务应用容器化,并在Docker环境中部署运行。本文旨在为开发者提供一个清晰、易懂的指南,帮助他们理解容器化技术的基本原理和操作流程,无论是初学者还是有经验的开发人员都能从中获益。
|
关系型数据库 MySQL Java
12-微服务技术栈(高级):容器引擎Docker
在前面的学习中,我们掌握了微服务的服务注册与发现(nacos)、配置中心(nacos)、远程服务调用(feign)、网关(gateway),同时借助Idea编译工具多次完成本地服务启动、部署和验证。在微服务架构中,不会再像传统那样单个单个部署服务器,而是会借助Docker进行批量的容器化部署。
431 0
|
存储 测试技术 Docker
羊年八问:微服务、容器与Docker
本文讲的是羊年八问:微服务、容器与Docker,【编者的话】作者从八个方面对当下热门的微服务、容器入手,提出一些问题与建议。读者可以通过此文理解这些技术在企业中的应用场景,其中一些问题值得读者深思熟虑。
1295 0
|
25天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2