docker swarm:在没有外部的情况下在堆栈之间共享网络

docker swarm: share a network between stacks without external

我正在使用 docker 组合在 Docker 集群上部署多个堆栈。

现在我已经在我的代理堆栈组合文件中定义了一个网络:

networks:
  proxy:
    driver: overlay

其他堆栈通过以下方式引用此网络:

networks:
  proxy_proxy:
    external: true

此设置的问题是所有其他堆栈现在都依赖于代理堆栈。删除代理堆栈(例如为了 replace/restart 它)将导致这样的错误:

Failed to remove network 800w54tbh7w7clc4o8uc3y7no: Error response from daemon: rpc error: code = 9 desc = network 800w54tbh7w7clc4o8uc3y7no is in use by service 0zu489jepz586sguqrorv6j6hFailed to remove some resources from stack: proxy

有没有一种方法可以在 docker compose 中定义一个网络而不是 "owned" 一个堆栈,这样如果它已经存在,任何新部署的堆栈都会加入它,如果它不存在它会被创建吗?

这样堆栈之间就没有依赖关系了。

我相信在这种情况下,网络对您的集群来说是全局的,并不是任何特定堆栈的一部分。

我建议使用 docker network create 手动创建它并在任何地方都将其称为 external

要创建,我建议在任何主节点上手动使用一些配置工具(如 Ansible 或 Salt)或 shell 脚本 运行。关键是,如果您需要重建集群或创建克隆,您将不必记住细节(或创建此网络所需的事实)。我不认为有 create a compose file with just networks 的方法,因此推荐 shell 脚本。