一、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