如何在 Ubuntu 16.04 上使用 Docker Swarm 和 DigitalOcean 创建 Docker 容器集群

介绍

Docker Swarm是部署 Docker 主机集群的 Docker 原生解决方案,您可以使用它快速部署运行在本地机器或支持的云平台上的 Docker 主机集群。

在 Docker 1.12 之前,设置和部署 Docker 主机集群需要您使用外部关键值存储器(如 etcdConsul用于服务发现。

在这个教程中,你会学会如何使用Docker 1.12的Swarm特性在DigitalOcean上部署一组多克机. 集群中的每个多克节点将运行Ubuntu 16.04. 在您可以运行由数十个,上百个,或上千个多克主机组成的集群时,我们在此教程中建立的集群将由一个管理器节点和两个工人节点组成,共3个集群成员. 一旦完成这个教程,就可以轻松地在你的集群中加入更多的节点.

前提条件

对于这个教程,你将需要:

  • 安装了多克的本地机器。 您的本地机可以运行任何 Linux 发行,甚至Windows 或 macOS. 对于Windows和macOS,使用 [官方安装器] (https://www.docker.com/products/docker-desktop)安装多克克. 如果您的本地机上有 Ubuntu 16.04 运行, 但 Docker 没有安装, 请参见 [ How To Install and Ubuntu 16.04] (https://andsky.com/tech/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04) 上的指示 。
  • DigitalOcean API指使. 如果没有,请使用[本指 (https://andsky.com/tech/tutorials/how-to-use-the-digitalocean-api-v2)生成. 当您生成一个符号时, 请确定它有读写范围 。 这是默认的, 因此, 如果您在生成时不更改任何选项, 它将具有读写能力 。 为了更容易在命令行上使用,请确保按照该条给定的变量指定符号。
  • Docker Machine安装在您本地的计算机上,用于创建三个主机. 在Windows和macOS上,多克安装包括多克机. 如果您正在本地运行Ubuntu 16.04,请参见如何在Ubuntu 16.04上以多克机提供和管理远程多克机主机,用于安装指令. .

步骤 1 – 提供集群节点

我们需要为我们的集群创建多个Docker主机,作为一个更新程序,以下命令提供一个单一的Dockerized主机,其中$DOTOKEN是对您的DigitalOcean API代币进行评估的环境变量:

1docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name

想象一下,你必须这样做,以建立由至少三个节点组成的群集,同时提供一个主机。

我们可以使用此命令自动配置任何 Docker 主机的过程,加上一些简单的 Bash 脚本。在本地机器上执行此命令,创建三个 Docker 主机,名为node-1,node-2node-3:

1[environment local]
2for i in 1 2 3; do docker-machine create --driver digitalocean \
3--digitalocean-image ubuntu-16-04-x64 \
4--digitalocean-access-token $DOTOKEN node-$i; done

成功完成命令后,您可以通过访问您的 DigitalOcean 仪表板或键入以下命令来验证所有机器的创建:

1[environment local]
2docker-machine ls

输出应类似于以下,并应作为快速参考来搜索节点的 IP 地址:

1[environment local]
2[secondary_label Output]
3NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
4node-1   -        digitalocean Running tcp://111.111.111.111:2376 v1.12.2   
5node-2   -        digitalocean Running tcp://111.111.111.112:2376 v1.12.2   
6node-3   -        digitalocean Running tcp://111.111.222.222:2376 v1.12.2

在此时,所有三个 Dockerized 主机都已经创建,你有每个主机的 IP 地址。它们都运行 Docker 1.12.x,但还不是 Docker 集群的一部分。在接下来的步骤中,我们将配置消防墙规则,使节点作为集群的成员,选择其中一个节点,使其成为 Docker Swarm 管理器,并将其余部分配置为 Docker Swarm 工作者。

步骤2:配置防火墙规则以允许Docker Swarm流量

一个集群必须至少有一个作为管理员的节点,但对于一个生产设置,建议三个管理员。对于这个设置,让我们选择第一个节点,使它成为Swarm管理员。

某些网络端口必须在将成为集群一部分的节点上打开,以使集群正常运行. 这需要配置防火墙,允许通过这些港口进行交通。 因为有三个不同的防火墙应用程序可以用来完成这个任务,所以您需要在每个防火墙应用程序的节点上执行的命令已经被记录在一个单独的文章中. 遵循 [此指 ([ LINK0] ) , 并为每个主机配置防火墙 。 在管理器上打开适当的端口,然后重复打开两个客户端节点上的端口.

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

步骤 3 – 启动集群管理器

我们已经决定‘node-1’将是我们的集群管理器,所以从您的本地机器登录到节点:

1[environment local]
2docker-machine ssh node-1

命令提示将改变以反映您现在已登录到该特定节点的事实. 若要将节点配置为 Swarm 管理器,请输入以下命令:

1[environment second]
2docker swarm init --advertise-addr node_ip_address

node_ip_address是节点的IP地址,您可以从docker-machine ls的输出或从您的DigitalOcean仪表板中获取。

你会看到输出,看起来如下:

 1[secondary_label Output]
 2[environment second]
 3Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
 4
 5To add a worker to this swarm, run the following command:
 6
 7    docker swarm join \
 8    --token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
 9    111.111.111.111:2377
10
11To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

在输出中是节点的ID,在本示例中是 a35hhzdzf4g95w0op85tqlow1 ,以及如何将其他节点添加到集群的说明。

所以现在你有一个Docker Swarm,配置了一个管理器,让我们将剩余的节点添加为工人。

步骤 4 – 将节点添加到集群

要完成此步骤,您可能需要打开另一个终端,然后单独离开您在 Swarm 管理器上登录的终端卡或窗口。

首先,从本地机器连接到node-2:

1[environment local]
2docker-machine ssh node-2

然后执行此命令,其中your_swarm_token是您在上一步创建群集时收到的代币,而manager_node_ip_address是 Swarm 管理器的 IP:

1[environment third]
2docker swarm join \
3--token your_swarm_token \
4manager_node_ip_address:2377

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

1[secondary_label Output]
2[environment third]
3This node joined a swarm as a worker.

node-2中退出,然后用node-3重复这个过程,将其添加到您的集群中。

如果防火墙规则被正确配置,你现在有一个功能的Docker Swarm,所有节点都同步。

第5步:管理群集

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

1[environment second]
2docker node ls

结果应该是这样的:

1[secondary_label Output]
2[environment second]
3ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
42qhg0krj00i4d3as2gpb0iqer node-2 Ready Active        
56yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active        
6a35hhzdzf4g95w0op85tqlow1 *  node-1 Ready Active Leader

此输出显示,我们正在处理一个 3 节点的 Docker Swarm 及其节点 - 一个经理和两个工人. 要查看您可以在管理节点上运行的其他管理命令,键入:

1[environment second]
2docker node --help

有关集群的详细信息,您可以使用以下命令管理员或工人(这是一个通用的Docker命令):

1[environment second]
2docker info

输出应该是这种类型的,并应该表明集群的状态(活跃 或** 正在等待** ),集群中的节点数量,以及特定节点是否是管理员或工人。

 1[secondary_label Output]
 2[environment second]
 3...
 4
 5Network: bridge host null overlay
 6Swarm: active
 7 NodeID: a35hhzdzf4g95w0op85tqlow1
 8 Is Manager: true
 9 ClusterID: f45u0lh7ag4qsl4o56yfbls31
10 Managers: 1
11 Nodes: 3
12 Orchestration:
13  Task History Retention Limit: 5
14 Raft:
15  Snapshot Interval: 10000
16  Heartbeat Tick: 1
17  Election Tick: 3
18 Dispatcher:
19  Heartbeat Period: 5 seconds
20 CA Configuration:
21  Expiry Duration: 3 months
22 Node Address: 104.236.239.4
23Runtimes: runc
24Default Runtime: runc
25Security Options: apparmor seccomp
26Kernel Version: 4.4.0-38-generic
27Operating System: Ubuntu 16.04.1 LTS
28OSType: linux
29...

如果您在工人节点上重复相同的命令,则 Is Manager 行应该显示false

<$>[注] 提示 :您可以随时从集群中添加或删除节点。

现在让我们获得一个在集群上运行的服务。

第6步:在Docker Swarm中运行服务

现在你有 Docker Swarm 并运行了,让我们运行测试容器,看看管理员如何处理它。在运行 Docker Engine 1.12 或更高版本的机器上,使用docker 服务命令部署容器作为服务。

因此,让我们使用官方的 Nginx 容器图像部署 Web 服务器:

1[environment second]
2docker service create -p 80:80 --name webserver nginx

在这个命令中,我们将 Nginx 容器中的端口80地图到集群上的端口80,以便我们可以从任何地方访问默认的 Nginx 页面。

若要查看在集群中运行哪些服务,请键入:

1[environment second]
2docker service ls

输出应采用此格式. REPLICAS 列显示该服务的实例运行次数:

1[secondary_label Output]
2[environment second]
3ID NAME REPLICAS IMAGE COMMAND  
40ymctkanhtc1 webserver 1/1 nginx

您可以通过使用docker service ps和服务名称来确定服务在哪个节点上运行。

1[environment second]
2docker service ps webserver

输出应该与以下相似:

1[secondary_label Output]
2[environment second]
3ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
439yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago

在本示例中,网页服务器服务在node-1上运行,因为它是运行在默认端口上的网页服务器,您可以通过将浏览器指向http://node-1_ip_address来访问它。

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

Docker Swarm的另一个功能是扩展服务的能力,也就是翻转服务的额外实例。假设我们想将我们早些时候开始的Web服务器服务扩展到五个实例。

1[environment second]
2docker service scale webserver=5

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

1[secondary_label Output]
2[environment second]
3ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
439yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago     
51er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago  
6evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago  
7d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago  
82hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago

这表明,四个新实例中有两个在node-3上启动,一个在node-1上启动,另一个在node-2上启动。

最后,如果服务故障,它会在同一个节点或在不同的节点上自动重新启动,如果原始节点不再可用。

结论

您已经看到使用 Docker Engine 1.12 和新的 Swarm 模式设置 Docker Swarm 是多么容易,您也已经看到如何在集群上执行一些管理任务,但还有更多。

1[environment second]
2docker swarm --help

有关 Docker Swarm 的更多信息,请访问 官方文档页面. 并确保查看其他 [Docker 相关文章](https://andsky.com/tags/docker?type= Tutorials) 在 DigitaloOcean。

Published At
Categories with 技术
comments powered by Disqus