You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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网络配置引发的问题。

核心原因分析

  1. MongoDB未启用持久化存储:配置中MongoDB的卷挂载被注释,容器重启后数据会完全丢失。即便未主动重启,Docker也可能因资源不足(OOM)自动重启容器,导致初始化的用户数据丢失。
  2. 端口暴露风险:MongoDB的27017端口绑定到所有网卡,存在被外部访问干扰的可能,94段IP大概率是外部或宿主机IP,可能对应非预期的连接请求。
  3. 连接池配置缺失:SpringBoot默认MongoDB连接池未配置重连策略,网络波动时可能使用失效连接,导致读取不到数据库中的用户数据。
  4. 网络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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:12:46