赞
踩
Docker Swarm 是 Docker 原生的解决方案,用于部署一组 Docker 主机的集群。您可以使用它快速部署在本地机器或支持的云平台上运行的 Docker 主机集群。
在 Docker 1.12 之前,设置和部署一组 Docker 主机集群需要您使用外部的键值存储,如 etcd 或 Consul 用于服务发现。然而,从 Docker 1.12 开始,不再需要外部发现服务,因为 Docker 自带一个内存中的键值存储,可以直接使用。
在本教程中,您将学习如何在 DigitalOcean 上使用 Docker 1.12 的 Swarm 功能部署一组 Docker 机器集群。集群中的每个 Docker 节点将运行 Ubuntu 16.04。虽然您可以运行由数十个、数百个或数千个 Docker 主机组成的集群,但在本教程中,我们将设置一个由一个管理节点和两个工作节点组成的集群,总共三个集群成员。完成本教程后,您将能够轻松地向集群中添加更多节点。
对于本教程,您需要:
我们需要为我们的集群创建几个 Docker 主机。作为复习,以下命令为单个 Docker 化主机提供了一个示例,其中 $DOTOKEN
是一个将评估为您的 DigitalOcean API 令牌的环境变量:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name
想象一下,要设置由至少三个节点组成的集群,需要逐个提供一个主机。
我们可以使用此命令自动化任意数量的 Docker 主机的配置过程,结合一些简单的 Bash 脚本。在本地计算机上执行此命令以创建三个 Docker 主机,命名为 node-1
、node-2
和 node-3
:
[本地环境]
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 地址的快速参考:
[本地环境]
NAME 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 工作节点。
集群必须至少有一个充当管理器的节点,尽管对于生产设置,建议使用三个管理器。对于此设置,让我们选择第一个节点并将其设置为 Swarm 管理器。其他两个节点将成为工作节点。
集群中的节点必须打开某些网络端口,以便集群能够正常运行。这需要配置防火墙以允许通过这些端口的流量。由于有三种不同的防火墙应用程序可用于完成此任务,已在单独的文章中记录了每个防火墙应用程序在每个节点上需要执行的命令。请按照此指南为每个主机配置防火墙。在管理器上打开适当的端口,然后重复在两个客户端节点上打开端口的操作。
完成此步骤后,您可以初始化集群管理器。
我们决定将 node-1
设为我们的集群管理器,因此从本地机器登录到该节点:
[本地环境]
docker-machine ssh node-1
命令提示符将会改变以反映您现在已经登录到了特定的节点。要将该节点配置为 Swarm 管理器,请输入以下命令:
[第二个环境]
docker swarm init --advertise-addr node_ip_address
node_ip_address
是节点的 IP 地址。您可以从 docker-machine ls
的输出或者您的 DigitalOcean 仪表板中获取它。
您将会看到以下类似的输出:
[第二个环境]
Swarm 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 \
111.111.111.111:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
输出中包含了节点的 ID,在这个例子中是 a35hhzdzf4g95w0op85tqlow1,以及如何将其他节点添加到集群的说明。
现在您已经配置了一个具有管理器的 Docker Swarm。让我们将剩余的节点添加为工作节点。
为了完成这一步,您可能需要打开另一个终端,并暂时离开您用来登录到 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
命令成功执行后,您将会看到以下响应:
[第三个环境]
This node joined a swarm as a worker.
退出 node-2
,然后重复这个过程,将 node-3
添加到您的集群中。
现在您已经将两个工作节点添加到了集群。如果防火墙规则配置正确,那么现在您已经拥有一个功能正常的 Docker Swarm,所有节点都已经同步。
在管理器和工作节点被分配到集群之后,所有 Docker Swarm 管理命令都必须在管理器节点上执行。因此,请返回到您用来添加管理器的终端,并输入以下命令以查看集群的所有成员:
[第二个环境]
docker node ls
输出应该类似于这样:
[第二个环境]
ID 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
要获取有关集群的详细信息,您可以在管理器或工作节点上使用以下命令(这是一个通用的 Docker 命令):
[第二个环境]
docker info
输出应该是这样的,并应该指示集群的状态(active 或 pending)、集群中的节点数量,以及特定节点是管理器还是工作节点。
[第二个环境] ... 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
。
现在让我们在集群上运行一个服务。
现在你已经搭建好了 Docker Swarm,让我们运行一个测试容器,看看管理节点如何处理它。在运行 Docker Engine 1.12 或更新版本的机器上,容器是使用 docker service
命令部署为服务的。和 docker node
命令一样,docker service
命令只能在管理节点上执行。
现在让我们使用官方的 Nginx 容器镜像部署一个 web 服务器服务:
[environment second]
docker service create -p 80:80 --name webserver nginx
在这个命令中,我们将 Nginx 容器中的端口 80
映射到集群中的端口 80
,这样我们就可以从任何地方访问默认的 Nginx 页面。
要查看集群中正在运行的服务,输入以下命令:
[environment second]
docker service ls
输出应该如下所示。REPLICAS 列显示服务的实例数量:
[environment second]
ID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
你可以使用 docker service ps
命令加上服务名称来确定服务正在哪些节点上运行。
[environment second]
docker service ps webserver
输出应该类似于以下内容:
[environment second]
ID 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 的默认页面。
通过 mesh 网络的魔力,运行在一个节点上的服务可以在集群的任何其他节点上访问。例如,这个 Nginx 服务也可以通过将浏览器指向集群中任何节点的 IP 地址来访问,而不仅仅是它所在的节点。试一试。
Docker Swarm 的另一个特性是能够扩展服务,也就是说,启动服务的额外实例。假设我们想要将之前启动的 webserver
服务扩展到五个实例。为此,我们只需输入以下命令,系统将创建四个额外的实例:
[environment second]
docker service scale webserver=5
docker service ps
的输出将显示新实例是在哪些节点上启动的:
[environment second]
ID 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 管理节点上执行以下命令。
[environment second]
docker swarm --help
有关 Docker Swarm 的更多信息,请访问官方文档页面。并且一定要查看 DigitaloOcean 上的其他与 Docker 相关的文章。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。