介绍
Docker Swarm是用于部署Docker主机集群的Docker本地解决方案。您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群。 在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如
etcd或
Consul)来进行服务发现。但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用。 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器。集群中的每个Docker节点将运行Ubuntu 16.04。虽然您可以运行由数十,数百或数千个Docker主机组成的群集,但我们将在本教程中设置的群集将由一个管理器节点和两个工作节点组成,共有三个群集成员。完成本教程后,您可以轻松地向集群中添加更多节点。
先决条件
对于本教程,您需要:
第1步 - 配置群集节点
我们需要为集群创建几个Docker主机。 作为刷新程序,以下命令提供单个Docker化主机,其中
$DOTOKEN
是一个环境变量,其计算结果为您的DigitalOcean API令牌:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name
想象一下,必须设置一个由至少三个节点组成的集群,一次配置一个主机。 我们可以使用此命令并结合一些简单的Bash脚本自动化配置任何数量的Docker主机的过程。在本地机器上执行此命令以创建三个名为
node-1
,
node-2
和
node-3
Docker主机:
for i in 1 2 3; do docker-machine create --driver digitalocean \
--digitalocean-image ubuntu-16-04-x64 \
--digitalocean-access-token $DOTOKEN node-$i; done
命令成功完成后,您可以通过访问您的DigitalOcean仪表板或输入以下命令来验证是否已创建所有计算机:
docker-machine ls
输出应类似于以下内容,它应该作为查找节点的IP地址的快速参考:
OutputNAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node-1 - digitalocean Running tcp://104.236.239.4:2376 v1.12.2
node-2 - digitalocean Running tcp://104.131.165.210:2376 v1.12.2
node-3 - digitalocean Running tcp://104.236.76.250:2376 v1.12.2
此时,所有三个Docker化主机已创建,并且您拥有每个主机的IP地址。他们也都运行Docker 1.12.x,但是还不是Docker集群的一部分。在接下来的步骤中,我们将配置防火墙规则,使节点成为集群成员,选择其中一个节点并将其作为Docker Swarm管理器,并将其余部分配置为Docker Swarm工作线程。
第2步 - 配置防火墙规则以允许Docker群交通
集群必须至少有一个节点作为管理器,但对于生产设置,建议使用三个管理器。对于此设置,让我们选择第一个节点,并将其设置为Swarm管理器。其他两个节点将是工作节点。 必须在将成为群集一部分的节点上打开某些网络端口,以使群集正常工作。这需要配置防火墙以允许通过这些端口的流量。因为有三个不同的防火墙应用程序可用于完成该任务,您需要在每个防火墙应用程序的节点上执行的命令已在单独的文章中记录。按照
本指南并为每个主机配置防火墙。打开管理器上的适当端口,然后重复以打开两个客户机节点上的端口。 完成此步骤后,可以初始化集群管理器。
第3步 - 初始化集群管理器
我们已经决定
node-1
将是我们的集群管理器,所以从本地机器登录到节点:
docker-machine ssh node-1
命令提示符将更改以反映您现在已登录到该特定节点的事实。要将节点配置为Swarm管理器,请键入以下命令:
docker swarm init --advertise-addr node_ip_address
node_ip_address
是节点的IP地址。 您可以从docker
docker-machine ls
的输出或从DigitalOcean仪表板获取它。 您将看到类似于以下内容的输出:
OutputSwarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
104.236.239.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
输出中是节点的ID,在此示例中为
a35hhzdzf4g95w0op85tqlow1 ,以及有关如何将其他节点添加到集群的指示信息。 所以现在你有一个经理配置的Docker Swarm。让我们将剩余的节点添加为工人。
第4步 - 将节点添加到集群
要完成此步骤,您可能想要打开另一个终端,现在离开您用于单独登录到Swarm管理器的终端选项卡或窗口。 首先,从本地机器连接到
node-2
:
docker-machine ssh node-2
然后执行此命令,其中
your_swarm_token
是在上一步创建集群时接收的令牌,
manager_node_ip_address
是Swarm管理器的IP:
docker swarm join \
--token your_swarm_token \
manager_node_ip_address:2377
命令成功执行后,您将看到此响应:
OutputThis node joined a swarm as a worker.
注销
node-2
,然后使用
node-3
重复此过程以将其添加到集群。 您现在已将两个工作节点添加到集群。如果防火墙规则配置正确,则现在具有正常运行的Docker Swarm,所有节点都已同步。
第5步 - 管理群集
在管理器和工作节点分配给集群后,所有Docker Swarm管理命令必须在管理器节点上执行。因此返回到您用于添加管理器的终端,并键入此命令以查看集群的所有成员:
docker node ls
输出应类似于:
OutputID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active
6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active
a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader
这个输出表明我们正在处理一个3节点的Docker Swarm及其节点 - 一个经理和两个工人。要查看可以在管理器节点上运行的其他管理命令,请键入:
docker node --help
有关集群的详细信息,您可以在manager或workers上使用以下命令(它是一个通用的Docker命令):
docker info
输出应该是这种类型,并且应该指示集群的状态(
活动或
待决 ),集群中的节点数以及特定节点是管理者还是工作者。
Output...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...
如果在工作线程节点上重复相同的命令,
Is Manager行应显示为
false
。
提示 :您可以随时从群集中添加或删除节点。
此外,工作节点可以升级为管理器,并且管理器可以转换为工作器。
现在让我们在集群上运行一个服务。
第6步 - 在Docker Swarm中运行服务
现在你有一个Docker Swarm并运行,让我们运行一个测试容器,看看管理器如何处理它。在运行Docker Engine 1.12或更高版本的计算机上,容器使用docker
docker service
命令部署为服务。 和
docker node
命令一样,
docker service
命令只能在管理器节点上执行。 所以让我们使用官方的Nginx容器图像部署一个web服务器服务:
docker service create -p 80:80 --name webserver nginx
在此命令中,我们将Nginx容器中的端口
80
映射到集群上的端口
80
,以便我们可以从任何位置访问默认的Nginx页面。 要查看集群上运行的服务,请键入:
docker service ls
输出应采取此形式。 REPLICAS列显示有多少服务实例正在运行:
OutputID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
您可以通过使用
docker service ps
后跟服务名称来确定服务正在运行的节点。
docker service ps webserver
输出应类似于以下内容:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago
在此示例中,
webserver
服务在
node-1
上运行。 由于这是一个在默认端口上运行的Web服务器,您可以通过将浏览器指向
http:// node-1_ip_address
来访问它。试一试。你会看到Nginx的默认页面。 借助网状网络的魔力,可以在集群的任何其他节点上访问在节点上运行的服务。例如,此Nginx服务也可以通过将浏览器指向集群中任何节点的IP地址来访问,而不仅仅是它正在运行的节点的IP地址。试一试。 Docker Swarm的另一个功能是缩放服务的能力,即启动服务的其他实例。假设我们想将我们之前启动的
webserver
服务扩展为五个实例。为此,我们只需键入以下命令,系统将创建四个实例:
docker service scale webserver=5
并且docker
docker service ps
的输出将显示在哪些节点上启动的新实例:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago
1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago
d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago
这表明四个新实例中的两个在
node-3
上启动,一个在
node-1
上启动,另一个在
node-2
上启动。 最后,如果服务关闭,如果原始节点不再可用,它会在同一节点或不同节点上自动重新启动。
结论
你已经看到了使用Docker Engine 1.12和新的Swarm模式设置Docker Swarm有多么容易。您还了解了如何在集群上执行几个管理任务。但还有更多。要查看可用的Docker Swarm命令,请在Swarm管理器上执行以下命令。
docker swarm --help
有关Docker Swarm的更多信息,请访问
官方文档页面 。 并且一定要检查DigitaloOcean上其他
Docker相关的文章 。