在 docker swarm 中禁用外部节点服务可访问性

Kib*_*ibo 5 docker swarm docker-compose

我有一个带有 2 个节点的 docker swarm,每个节点在全局模式下运行 2 个服务,因此每个节点都有 2 个服务在其中运行。
我的问题是如何强制 node1 中的 ubuntu 服务只连接到 node1 中的 mysql 服务,而不是使用循环方法来选择 mysql 服务。所以当我从 node1 中的 ubuntu 连接到 mysql 时,mysql -hmysql -uroot -p它只选择 node1 中的 mysql。


这是描述我的案例的 docker-compose 文件

version: '3.8'
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    networks:
      app-net: {}
    deploy:
      mode: global
  ubuntu:
    entrypoint: tail -f /dev/null
    deploy:
      mode: global
    image: ubuntu:20.04
    networks:
      app-net: {}
networks:
  app-net: {}
Run Code Online (Sandbox Code Playgroud)

当我尝试连接到 mysql 时,在 ubuntu 容器中使用这个 docker-compose 文件,它使用循环算法在两个节点中选择 mysql 服务。我试图实现的是强制每个服务仅对同一节点内的服务可见。

ane*_*yte 2

我想不出一种简单的方法来通过覆盖网络在群体中实现您想要的目标。但是,您可以使用 unix 套接字代替网络。只需创建一个卷,将其安装到 MySQL 和您的应用程序中,然后让 MySQL 将其套接字放到该卷上。Docker 将在每个节点上创建一个卷,因此您将在节点内关闭通信。

如果您坚持使用网络通信,您可以将节点的 Docker 套接字挂载到您的应用程序容器中,并使用它来查找在该节点上运行 MySQL 的容器的名称。获得名称后,您可以使用它连接到服务的特定实例。现在,它不仅很难制作,而且还是一种反模式和安全威胁,所以我不建议你实现这个想法。

最后还有 Kubernetes,Pod 内的容器可以通过 localhost 相互通信,但我认为您不会走那么远,不是吗?