Docker Compose部署SpringBoot+MongoDB数据丢失问题排查
问题排查与解决
问题场景
使用如下Docker Compose配置部署SpringBoot应用与MongoDB:
version: "3" services: api-bug-books-preprod: depends_on: - mongodb-preprod image: bug-books-api:preprod restart: always container_name: bug-books-preprod ports: - 9910:9910 environment: SPRING_DATA_MONGODB_HOST: mongodb-preprod SPRING_DATA_MONGODB_PORT: 27017 SPRING_DATA_MONGODB_DATABASE: bug-books-preprod mongodb-preprod: image: mongo:latest container_name: bug-books-mongodb-preprod restart: always ports: - 27017:27017 environment: MONGO_INITDB_DATABASE: bug-books # volumes: # - bug-books-preprod:/data/db volumes: bug-books-preprod: networks: bug-books-preprod:
执行docker compose up -d后容器正常运行,SpringBoot通过CommandLineRunner创建3个默认用户,初始登录无问题,但10-30分钟后使用相同用户登录提示「用户不存在」。MongoDB日志无删除请求记录,日志中出现172段、94段IP的异常变化,怀疑是Docker网络配置引发的问题。
核心原因分析
- MongoDB未启用持久化存储:配置中MongoDB的卷挂载被注释,容器重启后数据会完全丢失。即便未主动重启,Docker也可能因资源不足(OOM)自动重启容器,导致初始化的用户数据丢失。
- 端口暴露风险:MongoDB的27017端口绑定到所有网卡,存在被外部访问干扰的可能,94段IP大概率是外部或宿主机IP,可能对应非预期的连接请求。
- 连接池配置缺失:SpringBoot默认MongoDB连接池未配置重连策略,网络波动时可能使用失效连接,导致读取不到数据库中的用户数据。
- 网络IP异常关联:172段是Docker默认桥接网络的IP段,若MongoDB容器意外重建,会分配新的172段IP,若SpringBoot连接未处理重连逻辑,可能出现连接异常。
解决步骤
1. 启用MongoDB持久化卷
取消MongoDB服务中的卷挂载注释,确保容器重启后数据不会丢失:
mongodb-preprod: # ... 保留原有配置 ... volumes: - bug-books-preprod:/data/db
重新部署:
docker compose down -v docker compose up -d
2. 限制MongoDB端口访问范围
修改端口绑定为仅允许宿主机本地访问,避免外部干扰:
mongodb-preprod: # ... 保留原有配置 ... ports: - 127.0.0.1:27017:27017
若无需宿主机直接访问MongoDB,可直接删除ports配置,仅通过Docker内部网络让SpringBoot连接。
3. 优化SpringBoot MongoDB连接配置
在SpringBoot配置文件或环境变量中添加连接池重连相关配置:
spring.data.mongodb.connect-timeout=10000 spring.data.mongodb.socket-timeout=60000 spring.data.mongodb.max-wait-time=120000 spring.data.mongodb.connection-pool.max-size=20 spring.data.mongodb.connection-pool.min-idle=5 spring.data.mongodb.connection-pool.max-life-time=3600000 spring.data.mongodb.connection-pool.max-idle-time=600000
该配置确保连接池自动清理失效连接,并重连至MongoDB。
4. 验证容器稳定性
检查MongoDB容器是否存在意外重启记录:
docker logs bug-books-mongodb-preprod --tail 100 | grep "restart" docker inspect bug-books-mongodb-preprod | grep "RestartCount"
内容的提问来源于stack exchange,提问作者Ballo Ibrahima
相关产品推荐
相关产品推荐

