在运行 Docker 和 MySQL 的生产环境中,合理的磁盘划分对于系统稳定性、数据安全性、性能以及后期维护至关重要。
以下是推荐的硬盘划分策略、理由及最佳实践:
✅ 推荐方案:双盘分离(系统盘 + 数据盘)
| 分区/挂载点 | 用途 | 建议大小 | 文件系统 | 说明 |
|---|---|---|---|---|
/ (根分区) |
操作系统、Docker 引擎、容器元数据 | 20–50 GB | ext4/xfs | 仅存放系统文件和非关键数据 |
/data 或 /var/lib/mysql |
MySQL 数据目录 | 按需扩展(SSD/NVMe 优先) | xfs/ext4 | 核心业务数据 |
/var/lib/docker |
Docker 镜像、容器层、卷 | 按需扩展(建议独立挂载) | xfs/ext4 | 避免污染系统盘空间 |
📌 关键点:不要将 MySQL 数据和 Docker 存储都放在系统盘!
🔍 为什么这样划分?
1. 防止系统盘爆满导致服务崩溃
- Docker 默认使用
overlay2存储驱动,每个容器的读写层、镜像层都会占用磁盘空间。 - MySQL 的
.ibd文件、binlog、redo log 等会持续增长。 - 如果它们与系统共用一个分区,一旦磁盘写满:
- 系统无法写入日志 → SSH 断开、监控失效
- MySQL 可能损坏或拒绝写入
- Docker 容器启动失败
2. 便于备份、迁移和扩容
- 数据盘可以单独备份(如
mysqldump或直接拷贝/data)。 - 系统盘重装时不影响业务数据。
- 数据盘可替换为更快/更大的磁盘(如从 HDD 升级到 NVMe SSD)。
3. 性能隔离
- MySQL 对 I/O 延迟敏感,应放在高性能磁盘(SSD/NVMe)。
- 系统盘通常不需要高 IOPS,普通 SATA SSD 即可。
🛠️ 实际配置示例
步骤 1:创建数据盘并格式化
# 假设新磁盘为 /dev/sdb
sudo fdisk /dev/sdb # 创建分区,如 /dev/sdb1
sudo mkfs.xfs /dev/sdb1
sudo mkdir -p /data /var/lib/docker
sudo mount /dev/sdb1 /data
sudo mount /dev/sdb1 /var/lib/docker # 可选:共享同一数据盘
步骤 2:设置开机自动挂载
编辑 /etc/fstab:
/dev/sdb1 /data xfs defaults 0 2
/dev/sdb1 /var/lib/docker xfs defaults 0 2
步骤 3:修改 Docker 存储路径
编辑 /etc/docker/daemon.json:
{
"data-root": "/var/lib/docker"
}
重启 Docker:
sudo systemctl restart docker
步骤 4:修改 MySQL 数据目录
编辑 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf:
[mysqld]
datadir=/data/mysql
socket=/data/mysql/mysql.sock
确保权限正确:
sudo chown -R mysql:mysql /data/mysql
sudo chmod 750 /data/mysql
重启 MySQL:
sudo systemctl restart mysqld
⚠️ 注意事项
-
XFS vs ext4:
- XFS 更适合大文件和并发写入(MySQL 场景更优),但不支持在线缩小。
- ext4 更通用,支持在线扩容/缩容。
- 生产环境推荐 XFS(尤其 CentOS/RHEL 8+)。
-
Docker 卷(Volumes)管理:
- 始终使用命名卷而非绑定挂载宿主机目录,除非明确需要。
- 示例:
docker volume create mysql_data,然后映射到容器。
-
监控磁盘使用率:
- 设置告警阈值(如 >80% 警告,>90% 紧急)。
- 工具:
df -h,du -sh /var/lib/docker,du -sh /data/mysql
-
备份策略:
- 定期备份 MySQL 数据(
mysqldump或 Percona XtraBackup)。 - Docker 镜像和配置可版本化管理(Git),无需频繁备份。
- 定期备份 MySQL 数据(
-
安全考虑:
- 数据盘权限严格限制(
mysql:mysql,750)。 - 禁用不必要的 Docker API 访问。
- 数据盘权限严格限制(
📊 小型部署简化方案(单盘但逻辑分离)
如果只有一块磁盘,至少做到:
- 系统盘
/限制在 50GB 以内。 - 通过 LVM 或分区预留足够空间给
/var/lib/docker和/var/lib/mysql。 - 使用
tmpfs临时目录减少磁盘写入。
✅ 总结
| 原则 | 做法 |
|---|---|
| 隔离性 | 系统、Docker、MySQL 数据分开 |
| 可扩展性 | 数据盘独立,便于升级 |
| 安全性 | 权限最小化,定期备份 |
| 性能 | MySQL/Docker 用 SSD/NVMe |
💡 黄金法则:“系统归系统,数据归数据” —— 这是运维稳定性的基石。
轻量云Cloud