Docker主机名未在自定义网络中解析

时间:2018-07-24 13:25:47

标签: docker networking dns docker-compose dockerfile

我的docker-composer.yml文件中具有以下配置。

version: '3.3'
services:
  service-1:
    container_name: 'service-1'
    build: './service-1'
    depends_on:
      - 'mongo'
      - 'consul'
    networks:
      backend:
        aliases:
          - service-1
  service-2:
    build: './service-2'
    ports:
      - '8825:8825'
      - '8835:8835'
    networks:
      frontend:
      backend:
        aliases:
          - service-2
    depends_on:
      - 'mongo'
      - 'consul'
  consul:
    image: 'consul:latest'
    networks:
      backend:
        aliases:
          - consul
  mongo:
    image: 'mongo:latest'
    networks:
      backend:
        aliases:
          - mongo

networks:
  frontend:
  backend:
    internal: true

当我的容器启动时,它们无法使用主机名相互通信。 大多数容器使用mongo db容器,但它们甚至无法达到它,并且出现以下错误。

Error connecting to mongo : no reachable servers

请帮助我解决问题,我被卡住了。

谢谢。

1 个答案:

答案 0 :(得分:0)

撰写文件中有很多不需要的设置,这是一个精简的版本,同样适用:

version: '3.3'
services:
  service-1:
    build: './service-1'
    networks:
      - backend
  service-2:
    build: './service-2'
    ports:
      - '8825:8825'
      - '8835:8835'
    networks:
      - frontend
      - backend
  consul:
    image: 'consul:latest'
    networks:
      - backend
  mongo:
    image: 'mongo:latest'
    networks:
      - backend

networks:
  frontend:
  backend:
    internal: true

您将自动获得每个容器的服务名称的别名,而无需重复该别名。如果您给服务指定了容器名称,那么您也将失去扩展服务的能力。我还建议将构建步骤移出撰写文件,并为本地构建的应用使用图像名称。


现在,对于可能出现的问题,您的撰写文件中有一个depends_on。充其量,这不会满足您的需求。它会检查是否已创建并启动另一个容器,但不会检查其中的应用程序是否已准备好为流量提供服务,并且DB可能需要一些时间才能变得可用。最糟糕的情况是,如果尝试将其移入群集模式,则会收到不支持的错误。

与其依赖于docker,不如更新它的应用程序入口点以检查外部依赖关系,并等待一两分钟使它们变得可用,然后再失败。一个非常简单的示例工具是wait-for-it,它是作为bash shell脚本编写的。