在Ubuntu 16.04上用Docker Swarm和DigitalOcean创建一个Docker容器集群的方法

介绍

Docker Swarm是用于部署Docker主机集群的Docker本地解决方案。您可以使用它来快速部署在本地计算机或受支持的云平台上运行的Docker主机集群。

在Docker 1.12之前,设置和部署Docker主机集群需要使用外部键值存储(如etcdConsul)来进行服务发现。但是,使用Docker 1.12,不再需要外部发现服务,因为Docker提供了一个内置的键值存储,可以开箱即用。

在本教程中,您将了解如何使用Docker 1.12上的Swarm功能部署一组Docker机器。集群中的每个Docker节点将运行Ubuntu 16.04。虽然您可以运行由数十,数百或数千个Docker主机组成的群集,但我们将在本教程中设置的群集将由一个管理器节点和两个工作节点组成,共有三个群集成员。完成本教程后,您可以轻松地向集群中添加更多节点。

先决条件

对于本教程,您需要:

安装了Docker的本地机器。您的本地计算机可以运行任何Linux发行版,甚至Windows或macOS。对于Windows和macOS,使用官方安装程序安装Docker。 如果您的本地计算机上运行了Ubuntu 16.04,但未安装Docker ,请参阅如何在Ubuntu 16.04上安装和使用Docker以获取相关说明。

DigitalOcean API令牌。如果没有,使用本指南生成它。生成令牌时,请确保它具有读写范围。这是默认值,因此如果您在生成它时不更改任何选项,它将具有读写能力。为了更容易在命令行中使用,请务必将令牌分配给该文章中给出的变量。

Docker Machine安装在本地计算机上,您将使用它来创建三台主机。 在Windows和macOS上,Docker安装包括Docker Machine。

第1步 C 配置群集节点

我们需要为集群创建几个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地址的快速参考:

Output
NAME 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步 C 配置防火墙规则以允许Docker群交通

集群必须至少有一个节点作为管理器,但对于生产设置,建议使用三个管理器。对于此设置,让我们选择第一个节点,并将其设置为Swarm管理器。其他两个节点将是工作节点。

必须在将成为群集一部分的节点上打开某些网络端口,以使群集正常工作。这需要配置防火墙以允许通过这些端口的流量。因为有三个不同的防火墙应用程序可用于完成该任务,您需要在每个防火墙应用程序的节点上执行的命令已在单独的文章中记录。按照本指南并为每个主机配置防火墙。打开管理器上的适当端口,然后重复以打开两个客户机节点上的端口。

完成此步骤后,可以初始化集群管理器。

第3步 C 初始化集群管理器

我们已经决定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仪表板获取它。

您将看到类似于以下内容的输出:

Output
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 \
 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步 C 将节点添加到集群

要完成此步骤,您可能想要打开另一个终端,现在离开您用于单独登录到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

命令成功执行后,您将看到此响应:

Output
This node joined a swarm as a worker.

注销node-2 ,然后使用node-3重复此过程以将其添加到集群。

您现在已将两个工作节点添加到集群。如果防火墙规则配置正确,则现在具有正常运行的Docker Swarm,所有节点都已同步。

第5步 C 管理群集

在管理器和工作节点分配给集群后,所有Docker Swarm管理命令必须在管理器节点上执行。因此返回到您用于添加管理器的终端,并键入此命令以查看集群的所有成员:

docker node ls

输出应类似于:

Output
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及其节点 C 一个经理和两个工人。要查看可以在管理器节点上运行的其他管理命令,请键入:

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步 C 在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列显示有多少服务实例正在运行:

Output
ID  NAME REPLICAS IMAGE COMMAND 
0ymctkanhtc1 webserver 1/1 nginx

您可以通过使用docker service ps后跟服务名称来确定服务正在运行的节点。

docker service ps webserver

输出应类似于以下内容:

Output
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的默认页面。

借助网状网络的魔力,可以在集群的任何其他节点上访问在节点上运行的服务。例如,此Nginx服务也可以通过将浏览器指向集群中任何节点的IP地址来访问,而不仅仅是它正在运行的节点的IP地址。试一试。

Docker Swarm的另一个功能是缩放服务的能力,即启动服务的其他实例。假设我们想将我们之前启动的webserver服务扩展为五个实例。为此,我们只需键入以下命令,系统将创建四个实例:

docker service scale webserver=5

并且docker docker service ps的输出将显示在哪些节点上启动的新实例:

Output
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管理器上执行以下命令。

docker swarm --help

相关推荐