如何为 3 个不同主机中的现有 Docker Compose 文件设置 Docker Swarm?

How to setup Docker Swarm for an existing Docker Compose file intended to run in 3 different hosts?

我正在尝试为我的(可能很简单的)问题找出最佳解决方案。

我有一个 docker 包含一些服务的组合文件:

其余 api 需要可扩展。 Java-1、Java-2、Java-3 等

您在下面看到的是 3 台不同的主机。当我所有的主机都启动时,编写所有脚本的最佳解决方案是什么?我希望能够做类似 docker-compose up -d 的事情,并在 3 个不同的主机 上生成我的服务

我知道 docker swarm 可以做点什么。我还阅读了 Weave 网络与 Swarm 的结合。老实说,我很难把所有东西放在一起;了解如何使它基本上工作...

Java 主机要进行负载平衡(当然)。

我的 Host 1 会是我的集群管理器吗?接待 2 名和 3 名工人?我该如何管理?

你有什么建议吗? Rancher、Portainer、Docker-机器、其他...?

     Host 2
+-------------+                               
|             |                               
|   Java 1    |               Host 1       
|             |---\      +-------------------+
+-------------+    ---\  |                   |
                       --|   Mongo, Redis    |
    Host 3             --|                   |
+-------------+     --/  +-------------------+
|             |  --/                          
|   Java 2    |-/                             
|             |                               
+-------------+                               

    Host #
    ...

编辑:我的 RestApi 服务和数据库之间的链接需要加密。

正如您所提到的Docker Swarm 可以用来解决您的问题。最初你应该明白的是你的 Java (API), Mongo 和 Redis 不应该被识别为主机。他们将是 docker services in the swarm mode. So in your case, you would have three services in your docker swarm. Scaling it on your hosts is a job that's being done with Docker Swarm. As you have mentioned your Java (API) should be scaled, as a starting point imagine you would start with 3 Java (API) services, so imagine you have three host machines in your Docker Swarm, one is a manager other two are workers (deciding which host becomes manager which hosts are workers is up to you) and you just need to create three replicas of Java (API) services and Docker Swarm will run those three replicas on those three hosts, even if one host fails Docker Swarm will automatically redirect the traffic to hosts which are running the containers and will always run the number of replicas that you have told it to run. Which means if a container fails it will be recreated. These services can be easily scaled with simple command based on your purpose. So a good starting point would be to read about Docker Swarm Official documentation itself. Then follow the official swarm tutorial.

在Dockerswarm模式中,有一个叫做stack的特性,stack可以让你简单的部署一个完整的应用程序栈到swarm。您可以从 here 了解它。在您的情况下,正如您所提到的,您已经拥有了 compose 文件,可用于部署堆栈。您需要更新现有的 compose 文件以匹配您在应用程序堆栈中需要的配置。只需在 docker-compose.yml 文件中提及您想要什么以及您想要它的方式,Docker Swarm 就会为您创建它。

在您阅读了这些概念并准备好 Docker Swarm 设置和主机以及所有 Worker 和 Manager set-up 之后,请遵循这个很棒的 Docker Swarm vote app example。阅读该示例的 Docker 堆栈文件,这将使您了解如何正确定义您的应用程序堆栈,这将使您对 Docker 堆栈有一个坚实的了解,并使用相同的示例文件作为设计的基础您的应用程序堆栈。

之后,就是部署堆栈的问题了。只需 运行 docker stack deploy -c docker-compose.yml yourAppName

另外一点是,您可以在 Docker 中创建一个单独的 overlay 类型网络,专门用于您的应用程序。这将允许多个 Docker 守护程序主机(节点)之间的分布式网络。

编辑 - 所有 swarm 服务管理流量默认加密,使用 GCM mode. You can encrypt application data as well by add --opt encrypted when creating the overlay network. As the documentation mentions, this will carry a non-negligible performance penalty, so testing is expected before running the feature in production. Refer 6 中的 AES 算法加密覆盖网络部分的流量。

希望这个解释能帮助您理解 Docker Swarm 将如何解决您的问题并阐明您面临的问题。