Docker自定义网络中无法解析主机名

43次阅读
没有评论

问题描述

在使用Docker时遇到了一个问题。他在docker-compose.yml文件中配置了一些服务,但是这些服务在启动时无法通过主机名进行通信。大部分服务都依赖于MongoDB容器,但是它们甚至无法连接到MongoDB,用户收到了以下错误信息:”Error connecting to mongo: no reachable servers”。用户希望能够解决这个问题。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据回答1的建议,你可以简化你的docker-compose.yml文件,以下是一个简化后的示例:

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

在上面的示例中,我们移除了一些不必要的设置,并简化了网络配置。每个服务都会自动获得与其服务名称相对应的别名,因此不需要重复定义别名。此外,如果给服务指定了容器名称,那么就无法对其进行扩展。我们还建议将构建步骤移出docker-compose.yml文件,并使用本地构建的镜像名称。

方案2

回答1还提到了可能的问题所在。你的docker-compose.yml文件中使用了depends_on属性,但是这并不能保证容器内的应用程序已经准备好提供服务,特别是数据库可能需要一些时间来启动。相反,你可以更新应用程序的入口点,检查外部依赖项,并在失败之前等待一两分钟。一个简单的工具可以帮助你实现这个功能,它就是 wait-for-it,它是一个用Bash脚本编写的工具。

以上是解决这个问题的两种方案,你可以根据自己的需求选择其中一种。希望能帮到你!

正文完