一、Docker 数据卷挂载核心概念

1.1 数据卷的三种挂载方式

挂载方式 语法示例 特点 适用场景
匿名卷 - /data Docker自动命名,难管理 临时数据
命名卷 - db_data:/data 有明确名称,易管理 生产环境
绑定挂载 - ./data:/data 直接映射宿主机路径 开发环境

1.2 数据卷生命周期管理


# 数据卷声明示例 volumes: # 1. 使用默认驱动 mongo_data: # 2. 自定义配置 redis_data: driver: local driver_opts: type: none o: bind device: /path/on/host

二、项目实战:SpringBoot + Redis + MongoDB + RocketMQ 完整配置

2.1 项目结构


/usr/rocket-demo/ ├── docker-compose.yml ├── Dockerfile ├── broker.conf ├── mongo-init.js ├── data/ # 绑定挂载目录 │ ├── mongo/ │ ├── redis/ │ └── logs/ └── config/ # 配置文件目录 └── redis.conf

2.2 完整的 docker-compose.yml 配置


version: '3.8' services: # SpringBoot 应用服务 my-springboot-app: build: context: . dockerfile: Dockerfile image: my-springboot-app:latest container_name: my-springboot-app ports: - "8080:8080" environment: - SPRING_PROFILES_ACTIVE=prod - SPRING_DATA_MONGODB_URI=mongodb://root:root@mongo:27017/appdb?authSource=admin - SPRING_REDIS_HOST=redis - ROCKETMQ_NAME_SERVER=rmqnamesrv:9876 volumes: # 绑定挂载:应用日志 - ./data/logs:/app/logs # 绑定挂载:配置文件(开发环境热更新) - ./config/application-prod.yml:/app/config/application.yml:ro depends_on: - redis - mongo - rmqnamesrv - rmqbroker networks: - app-network restart: unless-stopped # Redis 服务 - 使用命名卷 redis: image: redis:7-alpine container_name: redis ports: - "6379:6379" command: - redis-server - /etc/redis/redis.conf - --requirepass - "123456" volumes: # 命名卷:数据持久化 - redis_data:/data # 绑定挂载:配置文件 - ./config/redis.conf:/etc/redis/redis.conf:ro networks: - app-network healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 3s retries: 3 # MongoDB 服务 - 混合挂载方式 mongo: image: mongo:5 container_name: mongo environment: MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: root MONGO_INITDB_DATABASE: appdb ports: - "27017:27017" volumes: # 命名卷:数据库数据 - mongo_data:/data/db # 命名卷:配置数据 - mongo_config:/data/configdb # 绑定挂载:初始化脚本 - ./mongo-init.js:/docker-entrypoint-initdb.d/init.js:ro networks: - app-network healthcheck: test: echo 'db.runCommand("ping").ok' | mongosh localhost:27017/test --quiet interval: 30s timeout: 10s retries: 3 # RocketMQ NameServer rmqnamesrv: image: apache/rocketmq:5.1.0 container_name: rmqnamesrv ports: - "9876:9876" command: sh mqnamesrv volumes: # 命名卷:日志存储 - rmq_namesrv_logs:/home/rocketmq/logs - rmq_namesrv_store:/home/rocketmq/store networks: - app-network restart: unless-stopped # RocketMQ Broker rmqbroker: image: apache/rocketmq:5.1.0 container_name: rmqbroker ports: - "10911:10911" - "10909:10909" environment: NAMESRV_ADDR: "rmqnamesrv:9876" JAVA_OPTS: " -Duser.home=/opt -Drocketmq.namesrv.addr=rmqnamesrv:9876 -Drocketmq.broker.ip=your_server_ip" command: sh mqbroker -c /opt/rocketmq/conf/broker.conf volumes: # 绑定挂载:Broker配置文件 - ./broker.conf:/opt/rocketmq/conf/broker.conf:ro # 命名卷:消息存储 - rmq_broker_store:/home/rocketmq/store - rmq_broker_logs:/home/rocketmq/logs depends_on: - rmqnamesrv networks: - app-network restart: unless-stopped # 网络定义 networks: app-network: driver: bridge ipam: config: - subnet: 172.20.0.0/16 # 数据卷定义 volumes: # MongoDB 数据卷 mongo_data: driver: local driver_opts: type: none o: bind device: /usr/rocket-demo/data/mongo/data mongo_config: driver: local # Redis 数据卷 redis_data: driver: local # RocketMQ 数据卷 rmq_namesrv_logs: driver: local rmq_namesrv_store: driver: local rmq_broker_store: driver: local rmq_broker_logs: driver: local

三、数据卷挂载实战详解

3.1 绑定挂载 (Bind Mounts) 实战

适用场景:开发环境、配置文件、日志文件


volumes: # 开发环境:源代码热部署 - ./src:/app/src # 配置文件:支持热更新 - ./config/app.conf:/etc/app/app.conf:ro # 只读挂载 # 日志文件:实时查看 - ./logs:/var/log/app

权限控制

  • :ro- 只读挂载(配置文件推荐)
  • :rw- 读写挂载(默认,数据目录推荐)

3.2 命名卷 (Named Volumes) 实战

适用场景:生产环境、数据库数据、需要Docker管理的数据


volumes: # 简单命名卷 - db_data:/var/lib/mysql # 带配置的命名卷 - database: driver: local driver_opts: type: nfs o: addr=192.168.1.100,rw device: ":/path/to/nfs"

3.3 临时卷 (tmpfs) 实战

适用场景:敏感数据、临时缓存


tmpfs: - /tmp - /var/cache:size=100m,uid=1000

四、数据备份与恢复实战

4.1 数据库备份脚本


#!/bin/bash # backup.sh BACKUP_DIR="./backup/$(date +%Y%m%d_%H%M%S)" mkdir -p $BACKUP_DIR # 备份 MongoDB docker compose exec mongo mongodump --uri="mongodb://root:root@localhost:27017/appdb" --out=/backup docker cp mongo:/backup $BACKUP_DIR/mongo # 备份 Redis docker compose exec redis redis-cli --rdb /data/dump.rdb docker cp redis:/data/dump.rdb $BACKUP_DIR/redis/ # 备份 RocketMQ 数据(如果需要) docker cp rmqbroker:/home/rocketmq/store $BACKUP_DIR/rocketmq/ echo "备份完成: $BACKUP_DIR"

4.2 数据恢复脚本


#!/bin/bash # restore.sh BACKUP_DIR=$1 if [ -z "$BACKUP_DIR" ]; then echo "用法: $0 <备份目录>" exit 1 fi # 恢复 MongoDB docker cp $BACKUP_DIR/mongo mongo:/restore docker compose exec mongo mongorestore --uri="mongodb://root:root@localhost:27017/appdb" /restore # 恢复 Redis docker cp $BACKUP_DIR/redis/dump.rdb redis:/data/ docker compose restart redis echo "数据恢复完成"

五、生产环境最佳实践

5.1 数据卷权限管理


services: app: image: myapp:latest user: "1000:1000" # 指定非root用户运行 volumes: - app_data:/data environment: - PUID=1000 - PGID=1000 volumes: app_data: driver: local driver_opts: o: uid=1000,gid=1000

5.2 多环境配置管理


# docker-compose.prod.yml services: mongo: volumes: - mongo_data_prod:/data/db redis: volumes: - redis_data_prod:/data volumes: mongo_data_prod: driver: local driver_opts: device: /mnt/ssd/mongo_prod redis_data_prod: driver: local driver_opts: device: /mnt/ssd/redis_prod

5.3 监控与日志管理


services: mongo: volumes: - mongo_data:/data/db - /var/log/mongo:/var/log/mongodb # 日志单独挂载 redis: volumes: - redis_data:/data - ./redis.conf:/etc/redis/redis.conf:ro # 日志收集器 logspout: image: gliderlabs/logspout volumes: - /var/run/docker.sock:/var/run/docker.sock volumes_from: - mongo - redis

六、故障排查与维护命令

6.1 数据卷管理命令


# 查看所有数据卷 docker volume ls # 查看数据卷详细信息 docker volume inspect rocket-demo_mongo_data # 查看数据卷使用情况 docker system df -v # 备份数据卷 docker run --rm -v rocket-demo_mongo_data:/source -v $(pwd):/backup alpine \ tar -czf /backup/mongo_backup.tar.gz -C /source ./ # 清理未使用的数据卷 docker volume prune

6.2 挂载点检查命令


# 检查容器挂载点 docker inspect my-springboot-app | jq '.[0].Mounts' # 检查文件权限 docker compose exec mongo ls -la /data/db # 检查磁盘空间 docker compose exec mongo df -h # 验证配置文件 docker compose exec redis cat /etc/redis/redis.conf

七、项目部署完整流程

7.1 初始化部署


# 1. 创建目录结构 mkdir -p /usr/rocket-demo/{data,config,backup} chmod -R 755 /usr/rocket-demo # 2. 创建配置文件 echo "brokerIP1=你的服务器IP" > broker.conf # 3. 启动服务 cd /usr/rocket-demo docker compose up -d # 4. 检查服务状态 docker compose ps docker compose logs -f

7.2 日常维护命令


# 查看服务状态 docker compose ps # 查看实时日志 docker compose logs -f my-springboot-app # 备份数据 ./backup.sh # 更新服务(保留数据) docker compose down docker compose pull docker compose up -d # 完全重置(删除所有数据) docker compose down -v docker compose up -d

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐