资讯专栏INFORMATION COLUMN

代码篇 | Docker1.12+Swarm构建动态微服务应用

JellyBool / 3104人阅读

摘要:首先启动该命令。这项机制在实际生产当中无疑非常重要。那么下面我们回顾一下之前了解到的信息我们创建了一款小型动态微服务应用,完全由构成。在多数情况下,这能够为应用后端服务建立起独立的代理机制。

这次数人云与大家分享的文章里,主要介绍了Docker Swarm如何凭借革新对整体场景进一步加以简化。事实上,如今我们已经可以轻松且直观地构建起一套Docker Swarm集群,快来一起体验一下吧:)

下面先来看看各项具体的更新内容:

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

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

移动部件更少了——赞!

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

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

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

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

下面看看当前配置:

root@pi6 $ docker version
Client:
Version:      1.12.0-rc1
API version:  1.24
Go version:   go1.6.2
Git commit:   1f136c1-unsupported
Built:        Wed Jun 15 15:35:51 2016
OS/Arch:      linux/arm

Server:
Version:      1.12.0-rc1
API version:  1.24
Go version:   go1.6.2
Git commit:   1f136c1-unsupported
Built:        Wed Jun 15 15:35:51 2016
OS/Arch:      linux/arm

很好,Docker 1.12 RC1已经准备就绪。下面启动各项必要服务。

首先看看我们能否在Docker CLI中找到隐藏的各项新功能。

root@pi6 $ docker
Usage: docker [OPTIONS] COMMAND [arg...]
      docker [ --help | -v | --version ]

A self-sufficient runtime for containers.
   ...
   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命令了。

查询其具体作用:

root@pi6 $ docker swarm

Usage:  docker swarm COMMAND

Manage Docker Swarm

Options:
      --help   Print usage

Commands:
  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”。看起来正是我们需要的。首先启动该命令。

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

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

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

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”带来了一些有趣的提示。我仍然删去其中不必要的部分:

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

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

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

Swarm: active
NodeID: 3fmwt4taurwxczr2icboojz8g
IsManager: No

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

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

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

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

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

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

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

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

root@pi6 $ curl http://192.168.178.24
I"m 1b6df814c654

一切顺利,鼓掌!

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

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

那就来实际验证一下吧:

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

root@pi6 $ for i in {1..5}; do curl http://192.168.178.24; done
I"m 8db1657e8517
I"m e1863a2be88d
I"m 1b6df814c654
I"m 8db1657e8517
I"m e1863a2be88d

非常简单。

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

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

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

如大家所见,已经启动的容器有5套,其中3套驻留于“pi6”中。

下面看看是否能够找到其它容器:

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

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

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

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

docker ps
CONTAINER ID        IMAGE                       COMMAND             CREATED             STATUS              PORTS               NAMES
58620e3d533c        hypriot/rpi-whoami:latest   "/http"             46 seconds ago      Up 43 seconds       8000/tcp            whoami.2.cgc4e2ixulc2f3ehr4laoursg
acc9b523f434        hypriot/rpi-whoami:latest   "/http"             46 seconds ago      Up 43 seconds       8000/tcp            whoami.3.67bhlo3nwgehthi3bg5bfdzue
e1863a2be88d        hypriot/rpi-whoami:latest   "/http"             8 minutes ago       Up 8 minutes        8000/tcp            whoami.4.0lg12zndbal72exqe08r9wvpg
8db1657e8517        hypriot/rpi-whoami:latest   "/http"             8 minutes ago       Up 8 minutes        8000/tcp            whoami.5.5z6mvsrdy73m5w24icgsqc8i2
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进行协作。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/26660.html

相关文章

  • 数人云CTO解读Docker 1.12和金融业容器化

    摘要:月日数人云在上海举办金融沙龙,邀请上交所和近二十家来自银行保险证券的技术专家一同探讨容器技术在金融业中的最佳实践。数人云肖德时在会上将传统金融行业通过容器可以解决的四大问题做了逐一解读。如何动态的分配,就是刚才上交所介绍的一些治理的方法。 7月29日数人云在上海举办金融沙龙,邀请上交所和近二十家来自银行、保险、证券的IT技术专家一同探讨容器技术在金融业中的最佳实践。数人云CTO肖德时在...

    Gemini 评论0 收藏0
  • 剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略

    摘要:腾讯云在年底决定开发容器产品随后组建容器技术团队并进行技术选型通过对不同编排工具的分析对比最终选择作为容器编排引擎并且迅速在年初推出容器解决方案为用户提供托管的一站式服务。但是腾讯云最终选择了现在看来这个选择无比正确。Kubernetes 很火,一大批互联网公司早已领先一步,搭建起专有的 PaaS平台,传统企业们看到的 Kubernetes的趋势,亦不甘落后,在试水的道上一路狂奔。虽然,Ku...

    icattlecoder 评论0 收藏0
  • SwarmKit知多少——来自源码世界的深入解读

    摘要:一个容器起来,能够对外服务,这时就看下一步的负载均衡服务发现以及编排。它们有不同的应用场景,比如倾向于四层的负载均衡。不单是负载均衡,它同时解决了服务发现和负载均衡两个点。 今天是数人云容器三国演义Meetup嘉宾演讲实录第二弹。数人云工程师春明为大家奉送了一盘干货的大餐,让我们读读源码,深入了解一下SwarmKit的世界吧! 小数前方预警:有大量代码出现! showImg(htt...

    stefanieliang 评论0 收藏0
  • Docker Swarm在生产环境中的进阶指南

    摘要:应该如何解决本文将给出若干提示,如何在生产环境中使用。路由匹配服务发现负载均衡跨容器通讯非常可靠。在单个端口上运行一个服务,节点的任意主机都可以访问,负载均衡完全在后台实现。 上周数人云给大家分享了——《你可能需要的关于Docker Swarm的经验分享》今天给大家带来这位作者大大的后续文章——《Docker Swarm在生产环境中的进阶指南》 当在本地开发环境中使用Docker,或者...

    galaxy_robot 评论0 收藏0
  • 数人云容器管理工具 Crane 现已开源

    摘要:指导员明伯伯数人云工程师手记相关阅读基于的集群管理开发实践服务发现,负载均衡和 这是一个容器信息臃肿的时代。 Docker 鲸鱼鼓着圆圆的肚子在西雅图开了一场名为 DockerCon2016 的大会,全球 4000 人参加, 8 大看点留下对容器生态的更多畅想。 数人云一直专注于以企业级的 Mesos +容器技术栈,出于对容器新技术的热爱,我们在社区版的工具上小试牛刀,距 Docker...

    NeverSayNever 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<