Docker Compose 数据卷挂载详解与项目实战

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

1.1 数据卷的三种挂载方式

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

1.2 数据卷生命周期管理

yaml 复制代码
# 数据卷声明示例
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 项目结构

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

2.2 完整的 docker-compose.yml 配置

yaml 复制代码
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) 实战

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

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

权限控制

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

3.2 命名卷 (Named Volumes) 实战

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

yaml 复制代码
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) 实战

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

bash 复制代码
tmpfs:
  - /tmp
  - /var/cache:size=100m,uid=1000

四、数据备份与恢复实战

4.1 数据库备份脚本

bash 复制代码
#!/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 数据恢复脚本

bash 复制代码
#!/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 数据卷权限管理

yaml 复制代码
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 多环境配置管理

yaml 复制代码
# 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 监控与日志管理

javascript 复制代码
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 数据卷管理命令

bash 复制代码
# 查看所有数据卷
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 挂载点检查命令

bash 复制代码
# 检查容器挂载点
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 初始化部署

bash 复制代码
# 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 日常维护命令

bash 复制代码
# 查看服务状态
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
相关推荐
后端小张1 小时前
【JAVA 进阶】SpringBoot 事务深度解析:从理论到实践的完整指南
java·开发语言·spring boot·后端·spring·spring cloud·事务
ChinaRainbowSea1 小时前
13. Spring AI 的观测性
java·人工智能·后端·spring·flask·ai编程
-大头.1 小时前
SpringBoot 全面深度解析:从原理到实践,从入门到专家
java·spring boot·后端
charlie1145141912 小时前
使用 Poetry + VS Code 创建你的第一个 Flask 工程
开发语言·笔记·后端·python·学习·flask·教程
aiopencode2 小时前
iOS 上架 App Store 全流程技术解读 应用构建、签名体系与发布通道的标准化方案
后端
Rexi2 小时前
go如何写单元测试2
后端
Rexi2 小时前
go如何写单元测试1
后端
Harry技术2 小时前
Spring Boot 4.0 发布总结:新特性、依赖变更与升级指南
spring boot·后端
武子康2 小时前
大数据-159 Apache Kylin Cube 实战:Hive 装载与预计算加速(含 Cuboid/实时 OLAP,Kylin 4.x)
大数据·后端·apache kylin