Docker与Traefik助微服务腾飞

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 本文讲的是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
本文作者:gaohongtao
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:Docker与Traefik助微服务腾飞
目录
相关文章
|
2月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同
在当今快速迭代和部署应用程序的背景下,微服务架构已成为企业开发的首选模式。此文章通过深入分析Docker容器化技术和Kubernetes集群管理工具,探讨了如何利用这两者协同工作以构建和维护一个高效的微服务系统。我们将剖析Docker和Kubernetes的核心原理,并展示它们如何简化部署流程、提高系统的可伸缩性和可靠性。本文旨在为开发者提供一套实践指南,帮助其在云原生时代下,构建出既灵活又强大的后端服务。
|
2月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
2月前
|
Kubernetes 开发者 Docker
构建高效微服务架构:Docker与Kubernetes的协同应用
【5月更文挑战第30天】 在当今软件开发领域,微服务架构已成为实现系统模块化、提升可维护性及扩展性的关键策略。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理,共同构建一个既高效又可靠的后端微服务环境。我们将剖析Docker和Kubernetes的核心功能,以及它们如何相辅相成,支撑起现代化的云原生应用程序部署和管理。文章还将提供具体实践案例,帮助开发者理解将理论应用于实际开发过程中的步骤和考虑因素。
|
6天前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
2月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美结合
【5月更文挑战第28天】在现代软件开发中,微服务架构已成为提高系统可维护性和扩展性的关键。本文深入探讨了如何利用Docker容器化技术和Kubernetes集群管理工具共同打造一个高效、可靠的微服务环境。通过分析两者的核心优势及互补特性,我们展示了一种优化的部署策略,旨在帮助开发者和系统管理员理解和实践在复杂分布式系统中实现服务的有效管理和自动化部署。
|
2月前
|
运维 监控 Docker
使用Docker进行微服务架构的部署
【5月更文挑战第18天】本文探讨了如何使用Docker进行微服务架构部署,介绍了Docker的基本概念,如容器化平台和核心组件,以及它与微服务的关系。通过Docker,每个微服务可独立运行在容器中,便于构建、测试和部署。文章详细阐述了使用Docker部署微服务的步骤,包括定义服务、编写Dockerfile、构建镜像、运行容器、配置服务通信、监控和日志管理以及扩展和更新。Docker为微服务提供了可移植、可扩展的解决方案,是现代微服务架构的理想选择。
|
2月前
|
Kubernetes 持续交付 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第17天】在当今云计算和微服务架构的大潮中,Docker容器化技术和Kubernetes容器编排系统成为了后端开发领域的热门技术栈。本文将探讨如何通过Docker和Kubernetes的结合使用来构建一个高效、可扩展且易于管理的微服务环境。我们将从基础概念出发,深入到实际操作层面,最后讨论这种组合对持续集成和持续部署(CI/CD)流程的影响,旨在为开发者和企业提供一种可靠的后端服务解决方案。
|
2月前
|
监控 持续交付 Docker
使用Docker进行微服务架构的最佳实践
【5月更文挑战第10天】本文探讨了使用Docker实施微服务架构的最佳实践。首先,理解微服务架构是拆分小型独立服务的模式,借助Docker实现快速部署、高可移植性和环境一致性。Docker的优势在于服务扩展、容器编排、自动化构建与部署。最佳实践包括:定义清晰服务边界,使用Dockerfile和Docker Compose自动化构建,利用Docker Swarm或Kubernetes编排,实施服务发现和负载均衡,监控与日志记录,以及持续集成和持续部署。Docker虽重要,但需与其他技术结合以确保系统整体稳定性。
|
2月前
|
负载均衡 Cloud Native Linux
Docker部署Traefik结合内网穿透远程访问Dashboard界面
Docker部署Traefik结合内网穿透远程访问Dashboard界面
|
2月前
|
Kubernetes 监控 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【5月更文挑战第4天】在现代软件开发中,微服务架构已成为实现可扩展、灵活且独立部署服务的流行解决方案。本文将探讨如何利用Docker容器化技术和Kubernetes容器编排平台来构建一个高效的微服务系统。我们将分析Docker和Kubernetes的核心优势,并指导读者如何通过这些工具优化微服务部署、管理和扩展过程。文章还将涉及监控和日志管理策略,以确保系统的健壮性和可靠性。