在运行 Docker 和 MySQL 的服务器中,合理划分系统盘和数据盘对性能、安全性和可维护性至关重要。以下是推荐的硬盘划分策略:
一、基本原则
-
分离系统与数据
- 系统盘(OS + Docker 引擎)和数据盘(MySQL 数据文件)应分开。
- 防止数据增长导致系统盘满,影响系统稳定性。
-
使用独立的数据盘挂载到容器
- MySQL 数据建议挂载到独立的数据卷(volume)或绑定挂载(bind mount),且该目录位于单独的数据盘上。
-
考虑 I/O 性能
- MySQL 对磁盘 I/O 敏感,建议使用高性能磁盘(如 SSD)作为数据盘。
-
便于备份与迁移
- 数据集中存储,方便做快照、备份和迁移。
二、推荐的硬盘划分方案
假设你有一块或多块硬盘,可以按以下方式划分:
方案 A:两块硬盘(推荐)
| 硬盘 | 用途 | 容量建议 | 文件系统 |
|---|---|---|---|
| 系统盘(/dev/sda) | 操作系统、Docker 引擎、容器镜像等 | 50–100GB | ext4/xfs |
| 数据盘(/dev/sdb) | MySQL 数据文件、日志、备份等 | 根据数据量决定(如 200GB 起) | xfs/ext4(建议 xfs,适合大文件) |
具体操作步骤:
-
安装操作系统到
/dev/sda,划分根分区/和 swap。 -
将
/dev/sdb格式化并挂载到/data或/var/lib/mysql-data:mkfs.xfs /dev/sdb mkdir /data mount /dev/sdb /data -
在
/etc/fstab中添加自动挂载:/dev/sdb /data xfs defaults 0 0 -
启动 MySQL 容器时,将数据目录挂载到
/data/mysql:docker run -d --name mysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your_password mysql:8.0
方案 B:一块硬盘(资源受限场景)
如果只有一块硬盘,仍建议逻辑分离:
| 分区 | 用途 | 建议比例 |
|---|---|---|
/(主分区) |
系统 + Docker 镜像 | 30%(如 100GB) |
/data 或 /var/lib/docker-volumes |
MySQL 数据 | 70% |
注意:避免将 MySQL 数据直接放在
/var/lib/mysql(宿主机默认路径),而应使用外部挂载点。
三、Docker 存储优化建议
-
Docker 数据目录可选迁移(可选)
- 默认 Docker 将镜像和容器存在
/var/lib/docker,可能占用大量空间。 - 若系统盘小,可将 Docker 根目录迁移到数据盘:
// /etc/docker/daemon.json { "data-root": "/data/docker" } - 重启 Docker 服务生效。
- 默认 Docker 将镜像和容器存在
-
使用命名卷(Named Volume)管理 MySQL 数据
docker volume create --driver local --opt type=xfs --opt device=/dev/sdb --opt o=bind mysql_data或更简单地使用 bind mount。
四、MySQL 特别注意事项
- 数据目录:
/var/lib/mysql→ 挂载到独立磁盘 - 日志文件:binlog、redo log、slow query log 建议也在数据盘
- 临时文件:确保
tmpdir不在系统盘 - 权限设置:确保 MySQL 容器有权限读写挂载目录
五、监控与维护
- 监控磁盘使用率(如用
df -h、Prometheus + Node Exporter) - 设置告警:数据盘使用 > 80%
- 定期备份
/data/mysql到其他存储或云存储
总结:最佳实践
✅ 推荐配置:
- 系统盘:50–100GB,SSD,存放 OS 和 Docker 引擎
- 数据盘:独立 SSD,挂载到
/data,存放 MySQL 数据 - 使用
-v /data/mysql:/var/lib/mysql挂载 - 可选:迁移 Docker 根目录到数据盘
❌ 避免做法:
- 把 MySQL 数据放在系统盘
- 不做磁盘分离,导致系统因磁盘满而宕机
- 使用 HDD 承载高并发 MySQL 业务
通过以上划分,你可以实现:
- 更高的 I/O 性能
- 更好的故障隔离
- 更容易的备份与扩容
如有更多需求(如高可用、集群部署),可进一步引入 LVM、RAID 或云存储方案。
云计算导航