介绍
Docker Swarm是用于部署Docker主机集群的Docker本地解决方案。您可以使用它来快速部署在本地机器或受支持的云平台上运行的Docker主机集群。 在Docker 1.12之前,设置和部署Docker主机集群需要您使用外部键值存储(如
etcd或
Consul)来进行服务发现。但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,它可以开箱即用。 在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器。集群中的每个Docker节点都将运行CentOS 7.虽然您可以运行由数十,数百或数千个Docker主机组成的集群,但我们将在本教程中设置的集群将由管理器节点和两个工作节点,共有三个集群成员。完成本教程后,您可以轻松地向集群中添加更多节点。
先决条件
对于本教程,您需要:
- 安装了Docker的本地机器。您的本地计算机可以运行任何Linux发行版,甚至Windows或macOS。对于Windows和macOS,使用官方安装程序安装Docker。 如果您的本地计算机上运行了CentOS 7,但未安装Docker ,请参阅如何在CentOS 7上安装和使用Docker 。
- DigitalOcean API令牌。如果没有,使用本指南生成它。生成令牌时,请确保它具有读写范围。这是默认值,因此如果您在生成它时不更改任何选项,它将具有读写能力。为了更容易在命令行中使用,请务必将令牌分配给该文章中给出的变量。
- Docker Machine安装在本地计算机上,您将使用它来创建三台主机。在Windows和macOS上,Docker安装包括Docker Machine。如果您在本地运行CentOS 7,请参阅如何在CentOS 7上使用Docker Machine配置和管理远程Docker主机以获取安装说明。
第1步 - 配置群集节点
我们需要为集群创建几个Docker主机。 作为刷新程序,以下命令提供单个Docker化主机,其中
$DOTOKEN
是一个环境变量,其计算结果为您的DigitalOcean API令牌:
docker-machine create --driver digitalocean --digitalocean-image centos-7-0-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 centos-7-0-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://111.111.111.111:2376 v1.12.2
node-2 - digitalocean Running tcp://111.111.111.112:2376 v1.12.2
node-3 - digitalocean Running tcp://111.111.222.222: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 (2n4y8bwu6s7c1kwdryd945zv1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-57m6beujakwyx0t2j5mglpi9juf8czapp8kf2tj3gudkgjkoda-0eg0x08w7uvyxiacmmx0zv67o \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
在输出中是节点的ID,在此示例中为
2n4y8bwu6s7c1kwdryd945zv1 ,以及有关如何将其他节点添加到集群的指示信息。 所以现在你有一个经理配置的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
4smt8qechkvb8qp02nwo2oe6t * node-1 Ready Active Leader
5wzik3knakgj0c24jmtmiy5oq node-2 Ready Active
7f6ws6oladh94xnmbfdhanokm node-3 Ready Active
这个输出表明我们正在处理一个3节点的Docker Swarm及其节点 - 一个经理和两个工人。要查看可以在管理器节点上运行的其他管理命令,请键入:
docker node --help
有关集群的详细信息,您可以在manager或workers上使用以下命令(它是一个通用的Docker命令):
docker info
输出应为此类型,并应指示集群的状态(
活动或
待决 ),集群中的节点数,以及特定节点是管理器还是工作线程。
Output...
Network: null host overlay bridge
Swarm: active
NodeID: 4smt8qechkvb8qp02nwo2oe6t
Is Manager: true
ClusterID: 31i554ti23njgxg28av52hv47
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: 111.111.111.111
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-327.22.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
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
ch7xnvy8upho webserver 1/1 nginx
您可以通过使用
docker service ps
后跟服务名称来确定服务正在运行的节点。
docker service ps webserver
输出应类似于以下内容:
OutputID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
4pfbvs7sh5mugtzckw4czhcfm webserver.1 nginx node-1 Running Running 2 minutes 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
4pfbvs7sh5mugtzckw4czhcfm webserver.1 nginx node-1 Running Running 3 minutes 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相关的文章 。