如何从一个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
相关产品推荐
相关产品推荐

