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

2024-05-02 12:52

本文主要是介绍如何在 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

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

我们可以使用此命令自动化任意数量的 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

命令成功完成后,您可以通过访问您的 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 工作节点。

步骤 2 —— 配置防火墙规则以允许 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:2377To 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

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

[第二个环境]
...Network: bridge host null overlay
Swarm: activeNodeID: a35hhzdzf4g95w0op85tqlow1Is Manager: trueClusterID: f45u0lh7ag4qsl4o56yfbls31Managers: 1Nodes: 3Orchestration:Task History Retention Limit: 5Raft:Snapshot Interval: 10000Heartbeat Tick: 1Election Tick: 3Dispatcher:Heartbeat Period: 5 secondsCA Configuration:Expiry Duration: 3 monthsNode 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 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 相关的文章。

这篇关于如何在 Ubuntu 16.04 上使用 Docker Swarm 和 DigitalOcean 创建 Docker 容器集群的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954286

相关文章

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

使用Python和Pyecharts创建交互式地图

《使用Python和Pyecharts创建交互式地图》在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据,下面我们看看如何使用Python和Pyec... 目录简介Pyecharts 简介创建上海地图代码说明运行结果总结简介在数据可视化领域,创建交互式地

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Pandas透视表(Pivot Table)的具体使用

《Pandas透视表(PivotTable)的具体使用》透视表用于在数据分析和处理过程中进行数据重塑和汇总,本文就来介绍一下Pandas透视表(PivotTable)的具体使用,感兴趣的可以了解一下... 目录前言什么是透视表?使用步骤1. 引入必要的库2. 读取数据3. 创建透视表4. 查看透视表总结前言