同网络Docker容器无法通信 MongoDB连接127.0.0.1被拒绝排查
Docker容器跨服务连接MongoDB失败故障定位
核心故障原因
连接失败的直接诱因是MongoDB连接地址配置错误:你在worker服务的环境变量中配置的MONGO_URI值为mongodb://localhost:27017/,而容器内的127.0.0.1/localhost指向的是worker容器自身的回环网络地址,并非同网络下部署的MongoDB容器,因此会抛出dial tcp 127.0.0.1:27017: connect: connection refused的报错。
配置逻辑矛盾点
- 你配置RabbitMQ连接时的写法是正确的:
RABBITMQ_URI=amqp://user:password@rabbitmq:5672/,直接使用了容器名rabbitmq作为连接主机,同自定义桥接网络下Docker内置DNS会自动将容器名解析为对应容器的内网IP,这也是RabbitMQ可以正常连通的原因。 - 从
docker inspect network返回的结果可以确认,MongoDB容器在app_network中的注册名称就是e-learning,内网IP为172.20.0.2,和worker容器不属于同一个网络命名空间,不可能通过worker自身的localhost访问到。 - 配置中写的
external_links字段属于多余配置:加入同一个自定义桥接网络的容器,默认就支持通过容器名互相解析访问,不需要额外配置链路规则。 - 额外配置隐患:你当前的环境变量值外层包裹了双引号,Docker Compose解析列表格式的environment配置时,会把这层双引号识别为变量值的一部分,可能引发后续URI解析异常。
修复操作
- 修改docker-compose.yml中worker服务的环境变量配置,调整后内容如下:
environment: - MONGO_URI=mongodb://e-learning:27017/ - MONGO_DATABASE=e-learning - RABBITMQ_URI=amqp://user:password@rabbitmq:5672/ - RABBITMQ_QUEUE=upload - 重建worker容器让配置生效,执行命令:
docker-compose up -d --force-recreate worker
连通性验证
重建完成后可进入worker容器内部验证端口连通性:
# 进入worker容器命令行 docker exec -it video-transformation-worker-1 sh # 测试MongoDB端口连通性 wget e-learning:27017
如果返回端口响应则说明网络链路正常,服务启动后即可正常完成数据库更新操作。
内容的提问来源于stack exchange,提问作者Wambugu macharia
相关产品推荐
相关产品推荐

