Docker1.12 + Swarm 构建动态微服务应用

我们在之前提到过一个示例,即一款由前端与多项后端服务共同构成的微服务应用。其中前端为Traefik HTTP代理,负责将各项请求路由至后端服务。而后端则非常简单,是一套基于Go的HTTP Web服务器,负责返回其运行所在的容器ID。

新的Docker Swarm不再需要为应用容器设置独立的HTTP代理。如上图所示的原有架构现在被精简为下图所示的形式:

移动部件更少了——赞!

另外,我们还为后端服务内置了负载均衡机制。我们甚至能够立足于集群内的任一节点访问这些服务。Docker Swarm还集成有一种内置网状路由机制,用于将各请求路由至适合的后端容器当中。

面对这些新功能,有些朋友可能认为Docker Swarm集群的设置过程会比原本更为复杂。事实上,整个流程反而更加简单。

仍然半信半疑?下面一起来看。

没错,这次我们仍然使用Raspberry Pi集群。我使用的是Docker 1.12内部版本,并将其安装在Raspberry Pi上。当Docker 1.12推出正式版后,我们会对内容做出针对性更新。

下面看看当前配置:


  1. root@pi6 $ docker version Client:
  2. Version: 1.12.0-rc1
  3. API version: 1.24
  4. Go version: go1.6.2
  5. Git commit: 1f136c1-unsupported
  6. Built: Wed Jun 15 15:35:51 2016
  7. OS/Arch: linux/arm
  8. Server:
  9. Version: 1.12.0-rc1
  10. API version: 1.24
  11. Go version: go1.6.2
  12. Git commit: 1f136c1-unsupported
  13. Built: Wed Jun 15 15:35:51 2016
  14. OS/Arch: linux/arm

很好,Docker 1.12 RC1已经准备就绪。下面启动各项必要服务。 首先看看我们能否在Docker CLI中找到隐藏的各项新功能。


  1. root@pi6 $ docker Usage: docker [OPTIONS] COMMAND [arg...]
  2. docker [ --help | -v | --version ]
  3. A self-sufficient runtime for containers.
  4. ... service Manage Docker services ... stats Display a live stream of container(s) resource usage statistics ... swarm Manage Docker Swarm ... update Update configuration of one or more containers Run 'docker COMMAND --help' for more information on a command.

我直接去掉了其中与上代版本完全一致的部分,而只留了不同之处。 现在我们可以使用docker swarm命令了。

查询其具体作用:


  1. root@pi6 $ docker swarm Usage: docker swarm COMMAND
  2. Manage Docker Swarm
  3. Options:
  4. --help Print usage Commands:
  5. init Initialize a Swarm. join Join a Swarm as a node and/or manager. update update the Swarm. leave Leave a Swarm. inspect Inspect the Swarm Run 'docker swarm COMMAND --help' for more information on a command.

就是说其用于“初始化一套Swarm”。看起来正是我们需要的。首先启动该命令。


  1. root@pi6 $ docker swarm init Swarm initialized: current node (1njlvzi9rk2syv3xojw217o0g) is now a manager.

现在我们的Swarm管理节点已经开始运行,接下来为集群添加更多节点。

前往集群中的另一节点并执行:


  1. root@pi1 $ docker swarm join pi6:2377 This node joined a Swarm as a worker.

使用上述命令,我们在刚刚创建的初始Swarm集群中声明了应当加入该Swarm管理节点的各个新节点。Docker Swarm会在后台执行相关操作。

举例来说,其会为不同集群节点设置经过加密的彼此通信通道。我们不再需要自行管理TLS证书。

每位曾经设置过Docker Swarm集群的朋友,都会意识到新的流程有多么简单。 不过到这儿还没有结束。

Swarm管理节点中的一条“docker info”带来了一些有趣的提示。我仍然删去其中不必要的部分:


  1. root@pi6 $ docker info ... Swarm: active
  2. NodeID: 1njlvzi9rk2syv3xojw217o0g
  3. IsManager: Yes
  4. Managers: 1
  5. Nodes: 2
  6. CACertHash: sha256:de4e2bff3b63700aad01df97bbe0397f131aabed5fabb7732283f044472323fc
  7. ... Kernel Version: 4.4.10-hypriotos-v7+
  8. Operating System: Raspbian GNU/Linux 8 (jessie)
  9. OSType: linux
  10. Architecture: armv7l
  11. CPUs: 4
  12. Total Memory: 925.4 MiB
  13. Name: pi6
  14. ...

如大家所见,我们现在已经在“docker info”输出结果中有了新的“Swarm”部分,其告诉我们当前节点属于一套Swarm管理节点,且该集群由两个集群节点构成。

在第二个节点上,其输出结果与管理节点稍有不同:


  1. Swarm: active NodeID: 3fmwt4taurwxczr2icboojz8g
  2. IsManager: No

到这里,我们已经拥有了一套有趣但仍然空空如也的Swarm集群。

我们还需要了解Docker 1.12中的service这项全新抽象定义。大家可能在前面的输出结果中注意到了docker service命令。所谓docker service,是指运行在容器当中且负责为外部世界提供运行在Swarm集群内的“service”的软件片段。

这样的一项服务可以由单一或者多套容器构成。在后一种情况下,我们可以确保服务拥有高可用性及/或负载均衡能力。

下面使用之前创建的“whoami”镜像建立这样一项服务。


  1. root@pi6 $ docker service create --name whoami -p 80:8000 hypriot/rpi-whoami buy0q65lw7nshm76kvy5imxk3

在“docker swarm ls”命令的帮助下,我们可以检查这项新服务的状态。


  1. root@pi6 $ docker service ls ID NAME SCALE IMAGE COMMAND
  2. buy0q65lw7ns whoami 1 hypriot/rpi-whoami

下面检查我们是否能够通过curl命令向eth0网络接口发送l http命令,从而请求目录页面。 


  1. root@pi6 $ curl http://192.168.178.24
  2. I'm 1b6df814c654

一切顺利,鼓掌! 有些朋友可能注意到,“docker swarm ls”命令的标题行中存在“SCALE”部分,这似乎意味着我们可以对服务进行扩展。


  1. root@pi6 $ docker service scale whoami=5
  2. whoami scaled to 5

那就来实际验证一下吧:


  1. root@pi6 $ docker service ls ID NAME SCALE IMAGE COMMAND
  2. buy0q65lw7ns whoami 5 hypriot/rpi-whoami
  3. root@pi6 $ for i in {1..5}; do curl http://192.168.178.24; done
  4. I'm 8db1657e8517
  5. I'm e1863a2be88d
  6. I'm 1b6df814c654
  7. I'm 8db1657e8517
  8. I'm e1863a2be88d

非常简单。

但这种方式与原有Swarm其实差不多,只不过在使用感受上更便捷也更快速。请注意,我们使用的是Raspberry Pi而非强大的服务器,所以要对性能拥有较为保守的估计。

下面从单一Docker引擎的角度来看看目前的运行状态:


  1. root@pi6 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. e1863a2be88d hypriot/rpi-whoami:latest "/http" 2 minutes ago Up 2 minutes 8000/tcp whoami.4.0lg12zndbal72exqe08r9wvpg
  3. 8db1657e8517 hypriot/rpi-whoami:latest "/http" 2 minutes ago Up 2 minutes 8000/tcp whoami.5.5z6mvsrdy73m5w24icgsqc8i2
  4. 1b6df814c654 hypriot/rpi-whoami:latest "/http" 8 minutes ago Up 8 minutes 8000/tcp whoami.1.bg4qlpiye6h6uxyf8cmkwuh52

如大家所见,已经启动的容器有5套,其中3套驻留于“pi6”中。 下面看看是否能够找到其它容器:


  1. root@pi1 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. db411a119c0a hypriot/rpi-whoami:latest "/http" 6 minutes ago Up 6 minutes 8000/tcp whoami.2.2tf7yhmx9haol7e2b7xib2emj
  3. 0a4bf32fa9c4 hypriot/rpi-whoami:latest "/http" 6 minutes ago Up 6 minutes 8000/tcp whoami.3.2r6mm091c2ybr0f9jz4qaxw9k

那么如果我们将这套Swarm集群驻留在“pi1”上,结果又会如何?


  1. root@pi1 docker swarm leave Node left the default swarm.

下面看看另一节点上的运行情况:


  1. docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. 58620e3d533c hypriot/rpi-whoami:latest "/http" 46 seconds ago Up 43 seconds 8000/tcp whoami.2.cgc4e2ixulc2f3ehr4laoursg
  3. acc9b523f434 hypriot/rpi-whoami:latest "/http" 46 seconds ago Up 43 seconds 8000/tcp whoami.3.67bhlo3nwgehthi3bg5bfdzue
  4. e1863a2be88d hypriot/rpi-whoami:latest "/http" 8 minutes ago Up 8 minutes 8000/tcp whoami.4.0lg12zndbal72exqe08r9wvpg
  5. 8db1657e8517 hypriot/rpi-whoami:latest "/http" 8 minutes ago Up 8 minutes 8000/tcp whoami.5.5z6mvsrdy73m5w24icgsqc8i2
  6. 1b6df814c654 hypriot/rpi-whoami:latest "/http" 15 minutes ago Up 14 minutes 8000/tcp whoami.1.bg4qlpiye6h6uxyf8cmkwuh52

这里的情况相当于“pi1”节点发生故障,此时“pi1”中运行的全部容器都会被自动迁移至另一集群节点。这项机制在实际生产当中无疑非常重要。

那么下面我们回顾一下之前了解到的信息:

我们创建了一款小型动态微服务应用,完全由Docker构成。Docker Swarm现在被整合至Docker-Engine当中,而不再以独立软件形式存在。在多数情况下,这能够为应用后端服务建立起独立的代理机制。不再需要使用nginx、HAProxy或者Traefik。

尽管活动部件数量有所减少,但我们现在反而拥有了内置的高可用性与负载均衡功能。我非常期待未来Docker Swarm正式版本中会带来哪些新的惊喜,又如何与Docker Compose进行协作。

原文发布时间为:2016-07-23

本文来自合作伙伴“Linux中国”

时间: 2024-10-26 05:35:00

Docker1.12 + Swarm 构建动态微服务应用的相关文章

《SpringBoot揭秘:快速构建微服务体系》—第1章1.3节微服务会带来哪些好处

1.3 微服务会带来哪些好处显然,随着系统复杂度的提升,以及对系统扩展性的要求越来越高,微服务化是一个很好的方向,但除此之外,微服务还会给我们带来哪些好处?1.3.1 独立,独立,还是独立我们说微服务打响的是各自的独立战争,所以,每一个微服务都是一个小王国,这些微服务跳出了"大一统"(Monolith)王国的统治,开始从各个层面打造自己的独立能力,从而保障自己的小王国可以持续稳固的运转.首先,在开发层面,每个微服务基本上都是各自独立的项目(project),而对应各自独立项目的研发团队

微服务的持续集成,四步“构建”一个代码世界

本文讲的是微服务的持续集成,四步"构建"一个代码世界,大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误. 今天我们就来聊一聊微服务的持续集成. 目录 一.持续集成之构建 二.持续集成之部署 三.持续集成之测试 四.持续集成之发布 五.总结 一.持续集成之构建 当微服务产生

硅谷Spring项目组专家教你利用Spring Cloud构建微服务

  在这一系列文章中,我将为您介绍利用Spring Cloud和Docker构建微服务平台的一些基本概念.   什么是Spring Cloud   Spring Cloud是一系列Pivotal云应用开放工具的合称,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式,为构建分布式系统的一些常见模式提供了解决方案.   如果您熟悉构建应用程序的Spring Framework,那么对Spri

基于Nginx搭建一个安全的、快速的微服务架构

本文讲的是基于Nginx搭建一个安全的.快速的微服务架构[编者的话]本文改编自Chris Stetson发表在nginx.conf 2016上的一个有关如今的微服务以及如何使用Nginx构建一个快速的.安全的网络系统的演讲,大家可以在YourTube上回看此次演讲. 0:00 - 自我介绍 Chris Stetson:Hi,我的名字是Chris Stetson,我在Nginx带领专业服务部门,同时也领导微服务实践. 今天我们要谈论微服务以及如何使用Nginx构建一个快速的.安全的网络系统.在我们

Spring Boot与Docker(四):额外的微服务、更新容器、Docker Compose和负载均衡

本文讲的是Spring Boot与Docker(四):额外的微服务.更新容器.Docker Compose和负载均衡,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第四篇,本篇我们我们将添加一些额外的服务/容器,并且更新容器,采用Docker Compose以及使用HAProxy容器进行负载均衡.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.S

Java微服务开发指南 -- 集群管理、失败转移和负载均衡的实践

集群管理.失败转移和负载均衡的实践     在前一章节中,我们快速的介绍了集群管理.Linux容器,接下来让我们使用这些技术来解决微服务的伸缩性问题.作为参考,我们使用的微服务工程来自于第二.第三和第四章节(Spring Boot.Dropwizard和WildFly Swarm)中的内容,接下来的步骤都适合上述三款框架. 开始     我们需要将微服务打包成为Docker镜像,最终将其部署到Kubernetes,首先进入到项目工程hola-springboot,然后启动jboss-forge,

应对海量并发请求,首席布道师谈微服务的应用架构设计

 何李石七牛云首席布道师   <Go语言程序设计>译者,Go语言/容器虚拟化技术布道师.实践者. 5年以上互联网创业经验和企业级产品研发.运营经验,同时也是互联网产品基础架构解决方案专家.   随着互联网网民数的爆发式增加以及人们对随时随地接入互联网诉求的加强,互联网产品需要面对的并发请求量越来越大,云计算的诞生和普及为海量并发请求的应用提供了弹性的硬件支撑. 本案例分享基于微服务的应用架构设计,内容涉及如何构建一个微服务应用,服务注册与发现,微服务测试和典型的微服务架构设计模式,以及微服务架

微服务实战:从架构到部署

本文讲的是微服务实战:从架构到部署[编者的话]在这篇文章里, 计划涵盖微服务架构(MSA)的核心架构概念,以及如何在实践中使用这些架构理论. 如今,微服务"Microservices"已经成为软件架构领域最流行的热词之一.市面上也有很多与微服务的基础知识以及优点相关的学习资料,但是关于如何在真实的企业场景中应用微服务的资料还是不多. 在这篇文章里, 我计划涵盖微服务架构(MSA)的核心架构概念,以及你如何在实践中使用这些架构理论. 单体架构 企业软件设计需要满足多种多样的业务需求.因此

5分钟学习基于Go,go-microservice-template,Minke的微服务

本文讲的是5分钟学习基于Go,go-microservice-template,Minke的微服务,[编者的话]本篇文章介绍了Go语言下构建微服务的例子,作者利用一个helloword讲解了如何使用他的微服务框架,该框架不仅包含了构建服务,还包括路由.请求验证.日志记录.测试.动态配置变更,最后将提供了将服务整合到Docker容器并持续集成.本文干货满满,虽然需要一些对Go语言的基础,但是这构建微服务的思路是通用的. 介绍 几周前我去参加一个零售环境下的技术会议,直到午饭时间都没人提及'Dock