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

如何从一个Docker容器访问另一个容器中的Node API

问题解决步骤

核心原因

两个Docker Compose项目虽都定义了boodil-network,但默认情况下Docker会为每个Compose项目创建带目录前缀的独立网络,导致两个容器实际不在同一网络内,无法通过容器名boodil-payments-api通信。

解决方案

1. 统一网络配置

修改主项目和第二个项目的docker-compose.yml,确保两者使用同一网络:

主项目docker-compose.yml 调整

显式指定网络名称,避免自动生成前缀:

version: "3.9"

networks:
  boodil-network:
    driver: bridge
    name: boodil-network  # 全局唯一的网络名称

volumes:
  boodil-mysql:

services:
  # 保留原有服务配置不变

第二个项目docker-compose.yml 调整

将网络声明为外部网络(表示该网络由其他Compose项目创建):

version: "3.9"

networks:
  boodil-network:
    external: true  # 引用已存在的boodil-network

services:
  # 保留原有服务配置不变

2. 确认Node API监听地址

确保主API的Node服务监听0.0.0.0而非localhost,否则仅容器内部可访问,其他容器无法连接:
在Node项目启动代码中修改监听配置:

app.listen(8080, '0.0.0.0', () => {
  console.log('API running on port 8080');
});

3. 验证网络连通性(可选)

重启两个项目后,进入第二个项目容器测试连通性:

# 进入第二个项目容器
docker exec -it boodil-demo-api sh

# 测试ping主API容器
ping boodil-payments-api

# 测试API调用
curl http://boodil-payments-api:8080/你的接口路径

4. 处理服务启动顺序(可选)

若第二个项目启动时主API未就绪,可添加健康检查确保主API启动完成后再启动第二个项目:
在主项目api服务中添加健康检查:

services:
  api:
    # 原有配置...
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]  # 替换为你的健康检查接口
      interval: 10s
      timeout: 5s
      retries: 5

在第二个项目api服务中添加依赖:

services:
  api:
    # 原有配置...
    depends_on:
      boodil-payments-api:
        condition: service_healthy

内容的提问来源于stack exchange,提问作者Dally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:31:24