如何使用 Docker Compose 与遗留 Docker Swarm

How to use Docker Compose with legacy Docker Swarm

我正在尝试使用 ComposeSwarm 部署我的应用程序。目前我不想将我的 docker-compose.yamlv2 升级到 v3。所以我只能用 standalone(legacy) swarm 而不是 docker swarm mode 基于 Stoneman 的 和官方 Swarm 文档。

official instruction之后,我成功搭建了一个swarm集群。我在swarm manager节点上运行docker -H :4000 info查看swarm集群状态,如下图。该集群中还有另外两个工作节点。接下来,我想 create 一个与这个集群的覆盖网络,并在 docker-compose.yaml 中引用这个网络。但是我在swarm manager节点上运行docker -H :4000 network create -d overlay test创建netwrok时报错:Error response from daemon: Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

那么,我如何创建一个带有 swarm 集群的网络(没有 docker-machinevirtual box)?目前,swarm 管理器和工作节点是 运行 作为 docker 容器。

在 swarm 模式下,您 运行 在 swarm 管理器主机上执行所有命令。与创建网络、秘密等相同。 您可以通过以下方式找到 docker 管理器机器: $docker 节点 ls 管理器主机标有 MANAGER STATUS:Leader。 在管理器上创建网络后,该群上的所有节点都应该看到该网络。

"I ran docker -H :4000 network create -d overlay test" 最好在堆栈 yml 文件中声明网络,以便更快、更轻松地部署。您可以创建网络并在 yml 文件中公开您的端口,无需在每次 运行 堆栈时手动创建它们。 在 docker 服务下添加以下块:

services:
...
#Network
   networks:
    - network-name-here
...
#Exposed ports:
  ports:
    - target: 4000 
      published: 4000

在 yml 文件的末尾添加以下块来声明网络,因此每次您 运行 $docker 堆栈部署时都会创建它:

networks:
  network-name-here:
   driver: overlay 

您是否首先使用自己的 etcd 后端设置了覆盖网络? https://docs.docker.com/network/overlay-standalone.swarm/

Swarm "classic" 已弃用并被 docker swarm 模式取代。经典中的一切都更难,包括设置叠加层。除非您有严格的要求,否则我不建议将它用于任何新事物。