【问题标题】:Docker stack deploy using overlay network - inconsistent behavior使用覆盖网络部署 Docker 堆栈 - 行为不一致
【发布时间】:2019-02-27 08:28:37
【问题描述】:

我正在使用 docker-compose.yml 文件(Swarm 堆栈部署)将 2 个容器(应用程序和 SQL)部署到同一个网络。 大多数情况下,应用程序通过其主机名作为连接字符串中的数据源与 SQL 通信没有问题。

但是,有时它根本找不到它。为了调试,我验证了每个节点上确实创建了overlay网络,在每个节点上检查网络时,我看到容器确实属于这个网络。

此外,当我运行docker exec 命令进入应用程序容器时,我尝试向 SQL 容器发送 ping,主机名确实解析到正确的 IP,但仍然没有响应。

这非常令人沮丧,因为它只是不时发生。 有关如何调试问题的任何建议?

version: '3.2'
services:
  sqlserver:
   image: xxxx:5000/sql_image
   hostname: sqlserver
   deploy: 
     endpoint_mode: dnsrr
   networks:
      devnetwork:
        aliases:
            - sqlserver

  test:
    image: xxxx:5000/test
    deploy: 
     endpoint_mode: dnsrr
    deploy:
     restart_policy:
        condition: none
     resources:
        reservations:
          memory: 2048M
    networks:
      - devnetwork

networks:
    devnetwork:
        driver: overlay

【问题讨论】:

  • 请粘贴有问题的 docker-compose.yml 文件。

标签: docker docker-compose docker-swarm docker-stack


【解决方案1】:

负载时的服务发现和 DNS 问题在 swarm 模式下是已知的。我们经常遇到这个问题。您可以发现未解决的问题 herehere

如果您运行大量使用网络应用程序,请考虑将您的工作节点和管理节点分开。这将有助于管理器很好地执行服务发现。

您可以更改服务发现组件并使用 ConsulZooKeeper 作为堆栈实现的一部分。

我会考虑使用一些服务网格来实现服务之间的数据绑定通信。 Consul 可以为你做。您可以从这种设计模式中获得很多好处。例如,安全和加密数据通信。

【讨论】:

  • 在所有节点上禁用防火墙后,它似乎没有被复制(至少现在是这样)。
  • 然后..又失败了。就像你说的,这可能是 swarm 中的一个错误。
  • @Daniel Rahamim 相信我 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2016-03-31
  • 2016-07-22
相关资源
最近更新 更多