问题描述
在使用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脚本编写的工具。
以上是解决这个问题的两种方案,你可以根据自己的需求选择其中一种。希望能帮到你!
正文完