Docker Swarm入门:如何搭建原生态Docker集群

Docker Swarm介绍

Docker Swarm是Docker原生态的集群技术。他可同Docker或者Docker-Machine的命令行行工具配合,提供在主机集群上部署容器引擎的基本功能。Docker Swarm同亚马逊ECS在功能域上的确存在很大差异。

亚马逊ECS 利用自有技术栈来运行Docker容器,包括在虚拟宿主机上运行EC2实例,实现动态自动扩展和缩减虚拟机,使用弹性负载均衡器(ELB)将负载分发到各个Docker容器,等等。

从另一个角度讲,Docker Swarm还仅仅只是一个集群工具:通过Swarm来注册可运行Docker容器的服务器,然后Swarm将部署容器到这些虚拟机上,通过Swarm实现主机的启动和停止、注册和注销,并设置负载均衡策略注册和注销容器。

然而,亚马逊ECS 更倾向于在AWS环境中构建容器集群,Docker Swarm的确有能力运行在任何地方,包括在亚马逊之外。目前,许多组织接纳云计算较慢,或者运行在一种混合云环境中,让部分应用或实例运行在公有云上,剩余应用运行在本地的数据中心内。

因此,无论组织是否接纳了云平台,在混合云或纯数据中心环境中,采用Swarm均可发挥Docker的技术优势。

Docker Swarm是如何工作的?

实施Docker Swarm采用了两类组件:

  • 管理者容器:运行在一台虚拟机上,用来管理环境,实现发布容器到不同的代理,向集群报告容器状态及部署信息。他是Docker Swarm的主要接口;
  • 代理:是一组运行在虚拟机上的容器服务,负责向管理容器注册代理,并运行最终的Docker容器服务。

图1 展示了相关概念

fig-1dockerswarm-1024x812.png

这个例子中,采用了一个Docker Swarm管理者,管理了两个代理(代理1、代理2),这两个代理运行了两个Nginx容器实例,这里管理者和代理都属于“Docker Machine”,“Docker Machine”含有Docker引擎并可运行Docker容器。在下一节中将看到,除了启动命令一个使用 Docker Machine命令而另一个使用docker命令外,Docker Machine和Docker容器自身非常相似。

在下一节的例子中将会阐述如何在本机上搭建一个Docker Swarm集群(参考图1中Docker主机的方式(在笔记本上搭建的方式))。在生产环境下,管理者和代理一样可直接运行在各自的虚拟机上。

开始Docker Swarm之旅

现在已经理解Docker Swarm的概念及工作原理,本节将带您一步一步的构建本地Docker Swarm集群,并启动运行。

第一步安装Docker,您可在相关链接中找到在Mac、Windows、Linux环境下安装Docker的相关信息,在安装Docker时,需要使用Docker-Machine的命令,创建Swarm的管理者和代理。 Docker Swarm的文档是这么定义Docker Machine的:

Docker Machine是一种在虚拟宿主机上安装Docker引擎工具,通过使用Docker-Machine命令行来管理宿主机。您可在办公网、数据中心或者云提供商(如AWS 或Digital Ocean)内,使用此命令在本机调用Mac或Windows的Virtualbox创建容器主机。使用Docker-Machine命令行可实现启动、检查、停止和重启一个管理者主机,升级Docker客户端及守护进程,以及配置同主机通信的Docker客户端。

启动Docker并打开一个Docker-Machine命令行终端,执行Docker-Machine的 ls 命令可看到所有运行在电脑上的Docker主机:

$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM default * virtualbox Running tcp://192.168.99.100:2376

我的电脑上,只设置了的运行在IP地址192.168.99.100的”默认“主机。由于需要创建并启动三个新的主机(1个管理者,2个代理),故需停止默认主机来确保本机资源:

$ docker-machine stop default

使用Docker-Machine create命令来创建三个Docker 主机:

$ docker-machine create -d virtualbox manager
$ docker-machine create -d virtualbox agent1
$ docker-machine create -d virtualbox agent2

至此,这些主机跟Swarm还没有任何关系,他们只是需要在电脑上运行的虚拟机,-d参数定义了创建主机的驱动。当创建主机时在本地运行时,驱动则应该是Virtualbox,执行Docker-Machine的 ls 命令可看到所有Docker主机:

$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
agent1 - virtualbox Running tcp://192.168.99.101:2376 v1.11.1
agent2 - virtualbox Running tcp://192.168.99.102:2376 v1.11.1 default - virtualbox Stopped Unknown
manager * virtualbox Running tcp://192.168.99.100:2376 v1.11.1

我们运行了三个主机,叫做管理者、代理1和代理2.在启动Swarm集群前,还需创建一个发现令牌,发现令牌是Swarm集群的唯一标识,使用令牌启动管理者,代理用令牌向管理者注册自己。

创建发现令牌

要创建发现令牌,需运行一个Docker Swarm容器的实例,并发送“创建”的命令参数。有趣的是,Docker Swarm是构建在Docker技术基础之上的,本节介绍内容包括:(1)创建发现令牌;(2)启动一个Swarm集群的管理者;(3)启动Swarm集群的代理;都将在一个预置的名叫“swarm”的Docker容器上执行。让我们继续探究。

Docker命令行工具用来向激活的主机发送命令,如上段命令中所示,“管理者”主机的“ACTIVE”列有一个星号,这意味着所有的Docker命令都要发送给这个管理者主机,下面介绍如何更改激活的主机。
首先建立一个发现令牌:

$ docker run --rm swarm create
Unable to find image 'swarm:latest' locally
latest: Pulling from library/swarm
eada7ab697d2: Pull complete
afaf40cb2366: Pull complete
7495da266907: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:12e3f7bdb86682733adf5351543487f581e1ccede5d85e1d5e0a7a62dcc88116
Status: Downloaded newer image for swarm:latest
7c14cbf2a86ecd490a7ea7ae4b795a6b

这行命令看着有些眼熟:

  • Docker run:运行指定的容器实例
  • “swarm”:是容器Docker 镜像的名字,用来创建容器。注意这里没有指定版本,因此默认为“swarm:latest”
  • “create”:是一个发送给“swarm”容器的命令
  • –rm:此命令参数告诉Docker执行完毕后删除Docker镜像,这意味着如果需要可重新下载此镜像,毕竟镜像占了空间。

在命令输出的最后一行就是发现令牌:7c14cbf2a86ecd490a7ea7ae4b795a6b。请保存,后续步骤需要使用。

K8S中文社区微信公众号
分享到:更多 ()

评论 抢沙发

评论前必须登录!