如何在同一环境运行多个Docker容器并实现容器间API通信
解决Docker容器间API连通问题的思路
核心问题根源
容器内的localhost指向容器自身的回环地址,而非宿主机或其他容器,所以直接用localhost:1026调用API必然失败。Docker Compose会自动创建专属桥接网络,同一网络内的容器可通过服务名互相访问。
1. 编写Docker Compose配置文件
创建docker-compose.yml,将两个服务定义在同一配置中,示例如下:
version: '3.8' services: api-service: build: ./api # 指向API项目的Dockerfile所在目录 ports: - "1026:8080" # 宿主机端口:容器内部应用监听端口(根据实际配置调整内部端口) restart: unless-stopped web-app-service: build: ./web-app # 指向Web应用项目的Dockerfile所在目录 ports: - "1028:8080" # 同理调整内部端口 depends_on: - api-service # 确保API服务先启动(仅保证启动顺序,不保证服务就绪) restart: unless-stopped
注意:容器内部端口是Java应用实际监听的端口(比如Spring Boot默认8080),而非宿主机映射的1026/1028,务必对应正确。
2. 修改Web应用的API调用地址
将Web应用中所有调用API的地址从localhost:1026替换为api-service:容器内部API端口(比如api-service:8080)。
如果应用支持环境变量配置,更推荐通过环境变量注入地址,避免硬编码:
- 在
docker-compose.yml的web-app-service中添加环境变量:environment: - API_BASE_URL=http://api-service:8080 - 在Java应用中读取该环境变量作为API基础地址。
3. 确保应用监听0.0.0.0
Java应用默认可能仅监听localhost(容器内部回环),导致其他容器无法访问。需要修改配置让应用监听所有网卡:
- Spring Boot:在
application.properties中添加server.address=0.0.0.0,或启动时加参数java -jar app.jar --server.address=0.0.0.0 - 其他Java应用:参考对应框架的配置文档,调整监听地址为
0.0.0.0
4. 验证连通性
启动服务后,可通过以下方式验证:
- 进入Web应用容器测试API调用:
docker-compose exec web-app-service curl http://api-service:8080/your-api-endpoint - 检查容器是否在同一网络:
(默认网络名是docker network inspect 你的compose项目名_defaultdocker-compose.yml所在目录名+_default)
内容的提问来源于stack exchange,提问作者V.T
相关产品推荐
相关产品推荐

