SpringBoot容器通过Docker-Compose连接Mongo容器报503错误求助
排查容器间Spring Boot与MongoDB连接失败的问题
我来帮你定位这个问题,结合你给出的配置,核心问题出在容器间通信的端口配置,还有启动顺序的就绪校验上,咱们一步步来解决:
1. 修正MongoDB连接URI的端口配置
你在application.properties里写的是:
spring.data.mongodb.uri=mongodb://mongo:27018/tsp
这里犯了一个容器间通信的常见错误:容器之间访问用的是目标容器的内部端口,而不是宿主机的映射端口。
Mongo容器内部默认端口是27017,27018是你映射给宿主机的端口(方便你本地直接连Mongo)。容器间通过服务名mongo访问时,应该用内部端口,所以正确的配置是:
spring.data.mongodb.uri=mongodb://mongo:27017/tsp
2. 解决容器启动顺序的就绪问题
depends_on只是保证你的Spring Boot应用在Mongo容器之后启动,但不保证Mongo已经完全初始化好可以接受连接了——这很可能是你遇到503的另一个原因。
可以给Mongo服务加上健康检查,让Spring Boot应用等Mongo完全就绪后再启动:
修改你的docker-compose.yml,给mongo服务添加健康检查,同时更新app服务的depends_on条件:
version: '3' services: app: container_name: VF-BACKEND restart: always build: . ports: - "8083:8080" #VF Webservice depends_on: mongo: condition: service_healthy # 移除links,Compose v3默认支持服务名发现,links已经过时 mongo: container_name: VF-MONGO image: mongo:4.0.2 ports: - "27018:27017" volumes: - /data/vfdb:/data/db healthcheck: test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"] interval: 10s # 每10秒检查一次 timeout: 5s # 超时时间5秒 retries: 5 # 最多重试5次
3. 验证容器间网络连通性(可选)
如果修改后还是有问题,可以进入Spring Boot容器,手动测试和Mongo容器的连通性:
- 进入容器:
docker exec -it VF-BACKEND sh - 测试ping连通性:
ping mongo(能ping通说明服务名解析正常) - 测试端口连通性:
telnet mongo 27017(能连上说明端口没问题)
最后步骤
- 把
application.properties里的Mongo端口改成27017 - 更新
docker-compose.yml的健康检查配置 - 重新构建并启动容器:
docker-compose down && docker-compose up --build
这样应该就能解决容器间的连接问题了,如果还有其他异常,可以把应用的日志贴出来,我再帮你分析。
内容的提问来源于stack exchange,提问作者sd1517
相关产品推荐
相关产品推荐

