You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 service2
    
    确认日志中显示的监听地址是0.0.0.0:80,而非localhost:80。
  • 临时关闭宿主机防火墙:
    若Ubuntu的ufw防火墙规则影响容器网络,可临时关闭测试:
    sudo ufw disable
    
    测试后再重新启用:sudo ufw enable

内容的提问来源于stack exchange,提问作者Сергей Палий

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:00:59