Docker Compose部署Spring Cloud Datastore出现Connection refused报错
问题根因
Docker Compose 部署的服务默认运行在独立桥接网络中,每个容器持有独立的网络命名空间:
- 宿主机浏览器访问
localhost:8081正常,是因为Docker将datastore容器的8432端口映射到了宿主机8081端口,此处的localhost指代宿主机本身 - 运行在
application容器内的Spring应用,配置中填写的localhost:8081会指向application容器自身的8081端口,该端口无服务监听,因此触发连接拒绝错误
解决方案
按以下步骤调整配置即可:
1. 修改Spring配置文件
将Datastore连接地址中的localhost替换为docker-compose中定义的datastore服务名,Docker内置DNS会自动将服务名解析为对应容器的内网IP,端口填写datastore容器内部的监听端口而非宿主机映射端口:
spring: cloud: gcp: project-id: test-project datastore: host: http://datastore:8432 emulator: enabled: true port: 8432
若使用的Spring Cloud GCP版本不支持host字段带http前缀,将host值改为
datastore:8432即可。
2. (可选)优化docker-compose配置
- 若不需要在宿主机直接访问Datastore模拟器,可以删除datastore服务下的ports端口映射段,仅保留容器内网通信,减少不必要的端口暴露
- 建议在application服务下添加
depends_on配置,保证Datastore模拟器先启动再拉起应用,避免启动顺序导致的临时连接失败,调整后配置参考:
services: application: image: openjdk:17 ports: - 9000:8080 # HTTP volumes: - ${BASE_PATH:-.}/build/libs/application.jar healthcheck: test: [ "CMD", "curl", "-f", "http://localhost:8080/health-check" ] interval: 10s timeout: 10s retries: 30 start_period: 10s depends_on: - datastore datastore: image: knarz/datastore-emulator ports: - 8081:8432 environment: CONSISTENCY: 1 # 模拟器使用强一致性模型,省略则默认模拟最终一致性
连通性验证
配置修改完成重启服务后,可执行以下命令进入application容器内部验证网络连通性:
- 进入容器:
docker compose exec application bash - 测试Datastore连接:
curl http://datastore:8432
命令返回ok即代表容器间网络通信正常,应用可正常调用Datastore服务。
内容的提问来源于stack exchange,提问作者Mateusz Sikora
相关产品推荐
相关产品推荐

