在部署 Docker 和 MySQL 的生产环境或高可用场景中,合理的磁盘划分对于性能、数据安全性和维护便利性至关重要。
以下是推荐的硬盘划分方案及详细理由:
🎯 核心原则
- 系统盘(OS Disk):仅用于操作系统、Docker 引擎、容器镜像层、日志文件。
- 数据盘(Data Disk)专门用于存放 MySQL 数据文件 和 Docker 持久化数据(Volumes/Bind Mounts)。
- 分离 I/O:避免数据库写入与系统日志/容器重建争用磁盘 I/O。
✅ 推荐分区方案
| 挂载点 | 用途 | 建议大小 | 说明 |
|---|---|---|---|
/ (根分区) |
操作系统、Docker 引擎、容器元数据 | 50–100 GB | 足够容纳 OS + Docker 默认存储驱动(overlay2)的基础层 |
/var/lib/mysql |
MySQL 数据目录 | 独立数据盘 | 关键! 将 MySQL 数据文件放在高性能 SSD/NVMe 上 |
/var/lib/docker |
Docker 运行时、容器日志、临时层 | 可单独划分或使用 LVM | 若容器多且日志大,建议单独挂载;否则可与系统盘共享但监控空间 |
/data 或 /mnt/data |
Docker Volumes / Bind Mounts | 独立数据盘 | 所有需要持久化的应用数据(如 Redis、Elasticsearch、用户上传文件等) |
💡 最佳实践:使用 LVM(逻辑卷管理) 或 RAID 组合,便于后续扩容。
🔧 具体实施步骤
1. 物理磁盘规划示例
假设你有两块 SSD:
- Disk 1 (
/dev/sda): 100GB → 系统盘 - Disk 2 (
/dev/sdb): 500GB → 数据盘
2. 格式化并挂载数据盘
# 创建分区(例如使用 fdisk 或 parted)
sudo fdisk /dev/sdb
# 格式化(推荐使用 ext4 或 xfs)
sudo mkfs.ext4 /dev/sdb1
# 创建挂载点
sudo mkdir -p /data
# 挂载
sudo mount /dev/sdb1 /data
# 设置开机自动挂载
echo '/dev/sdb1 /data ext4 defaults,nofail 0 2' | sudo tee -a /etc/fstab
3. 迁移 MySQL 数据到新盘
# 停止 MySQL
sudo systemctl stop mysql
# 复制数据到新盘
sudo rsync -av /var/lib/mysql/ /data/mysql/
# 修改权限
sudo chown -R mysql:mysql /data/mysql
# 编辑 MySQL 配置文件(my.cnf 或 mysqld.cnf)
sudo nano /etc/mysql/my.cnf
# 添加或修改:
# datadir=/data/mysql
# 重启 MySQL
sudo systemctl start mysql
4. 配置 Docker 使用数据盘(可选但推荐)
如果你希望 Docker 的容器数据也存储在数据盘上:
方法一:修改 Docker 默认存储路径
编辑 /etc/docker/daemon.json:
{
"data-root": "/data/docker"
}
然后重启 Docker:
sudo systemctl restart docker
方法二:使用 Volume 或 Bind Mount(更灵活)
在 docker-compose.yml 中明确指定持久化路径:
services:
db:
image: mysql:8.0
volumes:
- /data/mysql:/var/lib/mysql # 直接映射到数据盘
environment:
MYSQL_ROOT_PASSWORD: secret
⚠️ 注意事项
1. 文件系统选择
- ext4:通用性强,兼容性好。
- XFS:适合大容量文件和高并发写入,MySQL 官方推荐。
- 避免使用 NTFS/FAT:不支持 Linux 权限模型。
2. I/O 调度器优化
对于 SSD/NVMe,建议使用 none 或 mq-deadline 调度器:
# 查看当前调度器
cat /sys/block/sdb/queue/scheduler
# 临时设置为 none(SSD 推荐)
echo 'none' | sudo tee /sys/block/sdb/queue/scheduler
3. 监控磁盘空间
- 使用
df -h定期检查。 - 设置告警:当
/data使用率 > 80% 时触发警报。 - Docker 日志可能占用大量空间,定期清理或使用
logrotate。
4. 备份策略
- MySQL:使用
mysqldump或 Percona XtraBackup 定期备份。 - Docker Volumes:将
/data目录整体打包备份至远程存储(如 S3、NAS)。
5. 安全考虑
- 确保
/data目录权限正确(特别是 MySQL 数据目录)。 - 使用
tmpfs挂载/tmp和/var/tmp,减少磁盘写入。
📊 总结图示
[物理磁盘]
├── /dev/sda (100GB) → 系统盘
│ ├── / : OS, Kernel, Systemd
│ └── /var/lib/docker : Docker 引擎、镜像层、容器日志(小量)
│
└── /dev/sdb (500GB) → 数据盘(高性能 SSD)
├── /data/mysql : MySQL InnoDB 数据文件(高 I/O)
├── /data/docker : Docker Volumes(持久化容器数据)
└── /data/apps : 其他应用持久化数据(Redis, ES, etc.)
✅ 最终建议:
MySQL 数据必须与系统盘分离,并使用高性能磁盘。Docker 的持久化数据也应尽量放在数据盘上,以确保数据安全和性能隔离。
云知识CLOUD