【问题标题】:Disable external node service accessibility in docker swarm在 docker swarm 中禁用外部节点服务可访问性
【发布时间】:2020-09-03 08:51:41
【问题描述】:

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

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

【问题讨论】:

    标签: docker docker-compose swarm


    【解决方案1】:

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

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

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

    【讨论】:

    • 我选择你的最后一个选项花了大约 3 个周末,但我认为值得。
    【解决方案2】:

    你应该看看mode=host

    您可以绕过路由网格,这样当您访问给定节点上的绑定端口时,您始终访问的是在该节点上运行的服务实例。这称为主机模式。有几点需要牢记。

    ports:
    - target: 80
      published : 8080
      protocol: tcp
      mode: host
    

    【讨论】:

    • 感谢您的回复。但如前所述here swarm 模式没有此选项。
    • 我发送的链接明确是关于 Swarm 配置的,这与网络模式不同。
    • 是的,你是对的,我可以在我的 docker-compose 文件中使用这个配置,但 ubuntu 服务仍然使用循环算法选择 mysql 服务。我认为它对外部访问(暴露的端口)很有用,并且不适用于内部服务选择,因为它只是禁用了网状网络。
    【解决方案3】:

    除非我遗漏了什么,否则我会说你不应该使用全局部署,而是在 compose 文件中声明 2 个 ubuntu 服务和 2 个 mysql 服务,或者部署 2 个单独的堆栈,并且在这两种情况下都使用约束将容器固定到特定节点.

    第一种情况的示例如下:

    version: '3.8'
    services:
      mysql1:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: password
        deploy:
          placement:
            constraints: [node.hostname == node1]
      mysql2:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: password
        deploy:
          placement:
            constraints: [node.hostname == node2]
      ubuntu1:
        entrypoint: tail -f /dev/null
        image: ubuntu:20:04
        deploy:
          placement:
            constraints: [node.hostname == node1]
      ubuntu2:
        entrypoint: tail -f /dev/null
        image: ubuntu:20:04
        deploy:
          placement:
            constraints: [node.hostname == node2]
    

    【讨论】:

    • 感谢您的回复。您的解决方案通常不能解决问题,如果我想增加节点数怎么办。
    猜你喜欢
    • 1970-01-01
    • 2021-08-21
    • 2019-02-02
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多