当前位置:   article > 正文

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

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

介绍

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 的本地机器。您的本地机器可以运行任何 Linux 发行版,甚至是 Windows 或 macOS。对于 Windows 和 macOS,请使用官方安装程序安装 Docker。如果您的本地机器运行的是 Ubuntu 16.04,但未安装 Docker,请参阅《在 Ubuntu 16.04 上安装和使用 Docker》以获取说明。
  • DigitalOcean API 令牌。如果没有,请使用此指南生成。生成令牌时,请确保它具有读写权限。这是默认设置,因此如果在生成时没有更改任何选项,则将具有读写功能。为了在命令行上更容易使用,确保将令牌分配给一个变量,如该文章中所述。
  • 在本地计算机上安装了 Docker Machine,您将使用它来创建三个主机。在 Windows 和 macOS 上,Docker 安装包括 Docker Machine。如果您在本地运行 Ubuntu 16.04,请参阅《使用 Docker Machine 在 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
  • 1

想象一下,要设置由至少三个节点组成的集群,需要逐个提供一个主机。

我们可以使用此命令自动化任意数量的 Docker 主机的配置过程,结合一些简单的 Bash 脚本。在本地计算机上执行此命令以创建三个 Docker 主机,命名为 node-1node-2node-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
  • 1
  • 2
  • 3
  • 4

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

[本地环境]
docker-machine ls
  • 1
  • 2

输出应类似于以下内容,并且应作为查找节点的 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此时,所有三个 Docker 化主机都已创建,并且您拥有每个主机的 IP 地址。它们也都运行着 Docker 1.12.x,但尚未成为 Docker 集群的一部分。在接下来的步骤中,我们将配置防火墙规则,使节点能够作为集群的成员运行,选择一个节点并将其设置为 Docker Swarm 管理器,并将其余节点配置为 Docker Swarm 工作节点。

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

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

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

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

第三步 — 初始化集群管理器

我们决定将 node-1 设为我们的集群管理器,因此从本地机器登录到该节点:

[本地环境]
docker-machine ssh node-1
  • 1
  • 2

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

[第二个环境]
docker swarm init --advertise-addr node_ip_address
  • 1
  • 2

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出中包含了节点的 ID,在这个例子中是 a35hhzdzf4g95w0op85tqlow1,以及如何将其他节点添加到集群的说明。

现在您已经配置了一个具有管理器的 Docker Swarm。让我们将剩余的节点添加为工作节点。

第四步 — 将节点添加到集群

为了完成这一步,您可能需要打开另一个终端,并暂时离开您用来登录到 Swarm 管理器的终端标签或窗口。

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

[本地环境]
docker-machine ssh node-2
  • 1
  • 2

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

[第三个环境]
docker swarm join \
--token your_swarm_token \
manager_node_ip_address:2377
  • 1
  • 2
  • 3
  • 4

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

[第三个环境]
This node joined a swarm as a worker.
  • 1
  • 2

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

现在您已经将两个工作节点添加到了集群。如果防火墙规则配置正确,那么现在您已经拥有一个功能正常的 Docker Swarm,所有节点都已经同步。

第五步 — 管理集群

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

[第二个环境]
docker node ls
  • 1
  • 2

输出应该类似于这样:

[第二个环境]
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer    node-2    Ready   Active        
6yqh4bjki46p5uvxdw6d53gc0    node-3    Ready   Active        
a35hhzdzf4g95w0op85tqlow1 *  node-1    Ready   Active        Leader
  • 1
  • 2
  • 3
  • 4
  • 5

这个输出显示了我们正在处理一个 3 节点的 Docker Swarm 以及它的节点 — 一个管理器和两个工作节点。要查看您可以在管理器节点上运行的其他管理命令,请输入:

[第二个环境]
docker node --help
  • 1
  • 2

要获取有关集群的详细信息,您可以在管理器或工作节点上使用以下命令(这是一个通用的 Docker 命令):

[第二个环境]
docker info
  • 1
  • 2

输出应该是这样的,并应该指示集群的状态(activepending)、集群中的节点数量,以及特定节点是管理器还是工作节点。

[第二个环境]
...

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
...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

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

第六步 — 在 Docker Swarm 中运行服务

现在你已经搭建好了 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
  • 1
  • 2

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

要查看集群中正在运行的服务,输入以下命令:

[environment second]
docker service ls
  • 1
  • 2

输出应该如下所示。REPLICAS 列显示服务的实例数量:

[environment second]
ID            NAME       REPLICAS  IMAGE  COMMAND  
0ymctkanhtc1  webserver  1/1       nginx  
  • 1
  • 2
  • 3

你可以使用 docker service ps 命令加上服务名称来确定服务正在哪些节点上运行。

[environment second]
docker service ps webserver
  • 1
  • 2

输出应该类似于以下内容:

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

在这个例子中,webserver 服务正在 node-1 上运行。由于这是一个运行在默认端口上的 Web 服务器,你可以通过将浏览器指向 http://node-1_ip_address 来访问它。试一试,你会看到 Nginx 的默认页面。

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

Docker Swarm 的另一个特性是能够扩展服务,也就是说,启动服务的额外实例。假设我们想要将之前启动的 webserver 服务扩展到五个实例。为此,我们只需输入以下命令,系统将创建四个额外的实例:

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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

这显示了四个新实例中有两个是在 node-3 上启动的,一个是在 node-1 上启动的,另一个是在 node-2 上启动的。

最后,如果一个服务停止运行,它会自动在相同的节点上或者在另一个节点上重新启动,如果原始节点不再可用。

结论

你已经看到使用 Docker Engine 1.12 和新的 Swarm 模式设置 Docker Swarm 有多么容易。你还看到了如何在集群上执行一些管理任务。但还有更多。要查看可用的 Docker Swarm 命令,请在你的 Swarm 管理节点上执行以下命令。

[environment second]
docker swarm --help
  • 1
  • 2

有关 Docker Swarm 的更多信息,请访问官方文档页面。并且一定要查看 DigitaloOcean 上的其他与 Docker 相关的文章。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/560340
推荐阅读
相关标签
  

闽ICP备14008679号