总结
当我们开始使用Docker时,典型的配置是在某个机器上创建一个独立的应用程序。
在大多数情况下,在一台机器上运行所有的应用程序通常是不实际的,这种情况下,您将需要一种方法来跨许多机器分发应用程序。
这就是Docker集群所提供的功能。
Docker Swarm提供集群、可扩展性、发现和安全性等功能。在本文中,我们将创建一个基本的群集配置,并执行一些测试来说明docker的发现和连通性。
在这个演示中,我们将创建一个Docker集群,它将由一个集群管理器和一个Worker组成。为了方便起见,它将在AWS上运行。
体系架构
我们的目标架构将由运行在不同EC2主机上的AWS AMI映像中的几个Docker容器组成。这些示例的目的是演示如何使用Docker群集发现运行在不同主机上的服务并相互通信的概念。
在上面的Docker集群网络中,我们描述了Docker群管理器和几个Docker Worker之间的相互连接。在接下来的示例中,为了降低复杂性和成本,我们将使用一个管理器和一个Worker。请记住,您的实际配置可能由许多Docker Worder组成。
下面是一个潜在用例的示例。AWS负载均衡器,配置为将负载分配给运行在两个或多个EC2实例上的Docker群。
我们将在下面的示例中展示如何创建Docker群集网络,该网络将允许成员的DNS发现并允许成员之间进行通信。
先决条件
我们假设您对Docker有些熟悉,并且熟悉在AWS中设置EC2实例。
如果你对AWS不自信或想要稍微复习一下,请阅读以下文章:
Provision a free tier EC2 instance
Configure Docker on your EC2 instance
一些AWS服务将产生费用,所以请确保停止和/或终止您不使用的任何服务。此外,考虑设置账单警报,以警告您的收费太多。
配置
首先创建两个(2)EC2实例,然后在每个EC2实例上安装Docker。请参阅Docker支持的平台一节,了解Docker安装指南和实例说明。
以下是AWS开放端口以支持Docker Swarm和我们的端口连接测试:
在AWS Mule SG开放端口
对于我们的示例,我们将使用以下IP地址描述节点1和节点2:
Node 1: 10.193.142.248
Node 2: 10.193.142.246
在开始之前,让我们先看看现有的Docker网络。
Docker 网络
docker network ls
如果您从未在这个Docker守护进程上添加过网络或初始化过群集,那么网络列表的输出应该至少与下面的列表相似。
其他网络也可以显示。
Docker网络列表的结果:
从节点1,我们开始初始化群集。
创建 Swarm 主节点
docker swarm init --advertise-addr=10.193.142.248
您应该得到如下所示的响应。我们将使用提供的token将其他节点连接到群集。
swarm 初始化响应结果
Swarm initialized: current node (v9c2un5lqf7iapnv96uobag00) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-5bbh9ksinfmajdqnsuef7y5ypbwj5d9jazt47urenz3ksuw9lk-227dtheygwbxt8dau8ul791a7 10.193.142.248:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
根CA证书需要一到两分钟才能在群集中同步,因此,如果出现错误,请等几分钟后,然后再试一次。
如果您碰巧放错了令牌,您可以使用join-tokenargument为manager和worker列出令牌。
例如,在节点1上运行以下命令:
Manager Token for Node 1
docker swarm join-token manager
接下来,让我们把节点2加入群集。
Node 2 Joins Swarm
docker swarm join --token SWMTKN-1-5bbh9ksinfmajdqnsuef7y5ypbwj5d9jazt47urenz3ksuw9lk-227dtheygwbxt8dau8ul791a7 10.193.142.248:2377
This node joined a swarm as a worker.
从群集主节点1,我们现在可以看到连接的节点
在主节点, 列出所有节点
docker node ls
Results of Listing Nodes
另外,请注意,已经创建了一个Ingress网络,这为我们的群集网络提供了一个入口点。
Results of Docker Network Listing
让我们继续为单独容器创建集群网络。
Overlay Network Creation on Node 1
docker network create --driver=overlay --attachable my-overlay-net
docker network ls
Results of Docker Network Listing
运行我们的容器,加入 Overlay 网络
docker run -it --name alpine1 --network my-overlay-net alpine
Node 2加入 overlay网络, 我们使用打开端口 8083来测试我们在运行容器的连通性。
运行容器, 加入 Overlay 网络
docker run -it --name alpine2 -p 8083:8083 --network my-overlay-net alpine
验证我们的Overlay网络连通性
通过我们的容器运行,我们可以测试我们可以使用群集配置的DNS发现我们的主机。从节点2,让我们ping一下Nod 1容器。
Node 2 Pings Node 1, Listens on Port 8083
ip addr # show our ip address
ping -c 2 alpine1
# create listener on 8083
nc -l -p 8083
从节点1LetsPing节点2容器并连接到端口8083上它的open Listener
Node 1 Pings Node 2, Connect to Node 2 Listener on Port 8083
ip addr # show our ip address
ping -c 2 alpine2
# connect to alpine2 listener on 8083
nc alpine2 8083
Hello Alpine2
^C
在这里,您创建了从节点1到节点2的tcp连接,并发送了一条消息。类似地,在Docker overlay集群中运行时,您的服务可以连接和交换数据。
有了这些基本的构建块,您就可以将这些原则应用到实际的设计中了。
Cleanup
测试完成后,我们可以清理群配置。
Remove Node 2 Swarm
docker container stop alpine2
docker container rm alpine2
docker swarm leave
Remove Node 1 Swarm
docker container stop alpine1
docker container rm alpine1
docker swarm leave --force
这就是我们创建DockerOverlay网络的简单示例。通过简单的示例,可以创建更大、更复杂的Docker容器集群网络。
请确保删除在这些示例中可能使用的AWS资产,这样就不会产生任何持续的成本。
请关注公众号:程序你好