Docker Compose容器间HTTP请求失败问题排查求助
容器间请求超时问题排查与解决
核心问题定位
你遇到的connect ETIMEDOUT错误,最常见的原因是service2仅监听了容器内部的回环地址(127.0.0.1),导致同网络下的service1无法访问它的80端口。虽然宿主机能通过端口映射访问service2,但容器间的内部网络请求无法穿透回环地址。
具体修复步骤
1. 修改服务监听地址
将service2(以及service1)的app.listen代码修改为监听0.0.0.0,这样容器会监听所有可用网络接口,允许外部容器访问:
service2修改后代码:
const express = require('express'); const app = express(); const port = 80; app.get('/', (req, res) => { res.send('Hello from Service2!'); }); // 监听0.0.0.0,允许所有网络接口访问 app.listen(port, '0.0.0.0', () => { console.log(`Service2 listening at http://0.0.0.0:${port}`); });
service1同理修改监听地址:
const axios = require('axios'); const express = require('express'); const app = express(); const port = 80; app.get('/', async (req, res) => { try { const response = await axios.get('http://service2:80'); res.send(`Response from Service1: ${response.data}`); } catch (error) { console.error('Error making request to Service2:', error.message); res.status(500).send('Internal Server Error'); } }); // 监听0.0.0.0,允许所有网络接口访问 app.listen(port, '0.0.0.0', () => { console.log(`Service1 listening at http://0.0.0.0:${port}`); });
2. 重新构建并启动容器
执行以下命令重启服务:
docker-compose down docker-compose build docker-compose up -d
额外排查验证步骤
如果修改后问题仍存在,可执行以下操作进一步定位:
- 进入service1容器测试连通性:
docker-compose exec service1 sh # 先ping service2,确认DNS解析正常 ping service2 # 再用curl测试HTTP请求 curl http://service2:80 - 检查service2的日志:
确认日志中显示的监听地址是docker-compose logs service20.0.0.0:80,而非localhost:80。 - 临时关闭宿主机防火墙:
若Ubuntu的ufw防火墙规则影响容器网络,可临时关闭测试:
测试后再重新启用:sudo ufw disablesudo ufw enable
内容的提问来源于stack exchange,提问作者Сергей Палий
相关产品推荐
相关产品推荐

