使用覆盖网络部署Docker堆栈-行为不一致

时间:2019-02-27 08:28:38

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

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

但是,有时根本找不到它。为了对其进行调试,我已经验证了确实在每个节点上都创建了覆盖网络,并且在检查每个节点上的网络时,我发现该容器确实属于该网络。

此外,当我运行docker exec命令进入应用程序容器时,我尝试将ping发送到SQL容器,并且主机名的确解析为正确的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

1 个答案:

答案 0 :(得分:0)

在群集模式下,服务发现和负载上的DNS问题是众所周知的。我们经常遇到这个问题。您可以发现未解决的问题herehere

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

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

我会考虑使用一些服务网格来进行服务之间的数据绑定通信。 Consul可以为您做到。您可以从这种设计模式中受益匪浅。例如安全性和加密数据通信。