docker - 隔离 Swarm 上连接到 traefik 覆盖网络的容器

标签 docker docker-swarm traefik docker-swarm-mode

我在 docker swarm 中使用 traefik 运行多个堆栈,其中每个堆栈中的服务都连接到覆盖网络 (traefik-net),以便 traefik 可以与它​​们通信。

如果我在每个堆栈中都有一个名为相同服务名称 (service1) 的服务,然后任一堆栈中都有另一个服务 (service2) 尝试通过服务名称 (ping http://service1 ) 访问它,它会有时会命中其他堆栈中的service1,有时会命中同一堆栈中的service1。

docker网络创建--驱动程序覆盖traefik-net

堆栈1:

services:
  service1:
    networks:
      - default
      - traefik-net

  service2:
    networks:
      - default
      - traefik-net

networks:
  traefik-net:
    external: true

堆栈2:

services:
  service1:
    networks:
      - default
      - traefik-net

networks:
  traefik-net:
    external: true

我希望 service2 仅命中同一堆栈中的 service1。

我假设服务只能通过在服务名称前加上堆栈名称前缀来命中另一个堆栈中的服务 (ping http//stack2_service1)。但我了解到,由于 traefik-net 覆盖网络,它们显然可以在没有堆栈名称前缀的情况下相互调用。

有没有办法在没有堆栈名称前缀的情况下关闭跨堆栈的服务通信?

或者也许有针对该问题的 traefik 特定解决方案?

如果有人遇到这个问题,我将非常感谢解决方案。

最佳答案

是的,有一个解决方案可以满足您想要实现的目标,您只需要正确使用覆盖网络即可。

默认情况下,连接在同一覆盖网络中的所有服务都可以相互通信/解析。

那么让我们想象一下您当前的实现。现在您拥有一个网络 traefik-net,并且您已将所有服务连接到该网络,因此您的设计如下所示:

enter image description here

为了隔离不同堆栈上的服务,但又能让 traefik 访问它们,您需要做的是在每个堆栈文件中创建不同的覆盖网络,并通过在 traefik 堆栈文件中将它们定义为外部网络,将 traefik 服务连接到这些网络。你最终会变成这样:

enter image description here

在此实现中,不同堆栈之间的所有流量只能通过 traefik 服务进行,而不是直接进行。

关于docker - 隔离 Swarm 上连接到 traefik 覆盖网络的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56010982/

相关文章:

kubernetes - Traefik Helm Chart 404

linux - 当向主机发送关闭信号时,docker 如何处理容器关闭?

docker - docker-for-mac&kubernetes在命名空间kube-system中没有pod

docker - 在travis CI中连接到Docker Hub

azure - 如何在Azure容器服务中获取Swarm代理负载均衡器的URL

ssl - Traefik Error forwarding EOF/Bad Gateway (Let's Encrypt 相关)

docker - 如何将Docker图层拆分为较小的文件(上传时)?

docker - 在有连接问题的 docker-compose 中,在 root 旁边创建新用户

java - 在 docker swarm + fluidd 上记录 java 异常

ssl - 没有让我们加密的Traefik SSL