在阿里云服务器上,强烈建议将 Docker 容器数据(尤其是持久化数据)放在数据盘上,而不是系统盘。
以下是详细分析和建议:
✅ 最佳实践:Docker 数据放在数据盘
1. 避免系统盘空间耗尽导致服务中断
- 系统盘通常较小(如 40GB~100GB),且用于存放操作系统、日志、临时文件等。
- Docker 镜像层、容器日志、卷数据会快速增长,容易撑爆系统盘。
- 一旦系统盘满,可能导致:
- Docker 无法启动新容器
- 系统异常甚至崩溃
- 需要紧急扩容或清理,影响业务连续性
2. 便于备份与迁移
- 数据盘可以独立快照、备份、挂载到其他实例。
- 系统盘通常随实例创建时绑定,迁移成本高。
- 使用数据盘可实现“存算分离”,更符合云原生架构理念。
3. 性能优化
- 数据盘(尤其是 ESSD 云盘)可提供更高 IOPS 和吞吐量。
- 将数据库、日志等 IO 密集型应用放在数据盘,可提升整体性能。
4. 成本可控
- 系统盘大小固定,扩容需停机或复杂操作。
- 数据盘可按需扩展,弹性更好。
📌 如何配置?
方法一:修改 Docker 默认存储路径(推荐)
# 1. 停止 Docker
sudo systemctl stop docker
# 2. 创建数据盘挂载点(假设数据盘已格式化为 /dev/vdb,挂载到 /data)
sudo mkdir -p /data/docker
# 3. 编辑 daemon.json
sudo vi /etc/docker/daemon.json
# 添加以下内容:
{
"data-root": "/data/docker"
}
# 4. 重启 Docker
sudo systemctl start docker
# 5. 验证
docker info | grep "Docker Root Dir"
方法二:使用 Volume 挂载到数据盘
即使 Docker 根目录仍在系统盘,也可通过 -v 或 volume 将关键数据映射到数据盘:
# docker-compose.yml 示例
services:
mysql:
image: mysql:8.0
volumes:
- /data/mysql/data:/var/lib/mysql # 数据放在数据盘
- /data/mysql/logs:/var/log/mysql
⚠️ 注意事项
-
系统盘保留必要内容
Docker 的二进制文件、配置文件、非持久化运行时数据可留在系统盘,但所有持久化数据必须放在数据盘。 -
日志管理
Docker 容器日志默认存放在/var/lib/docker/containers/<id>/<id>-json.log,位于系统盘。建议:- 配置日志轮转(
log-driver: json-file,max-size,max-file) - 或将日志也挂载到数据盘
- 配置日志轮转(
-
权限与安全
确保数据盘挂载后权限正确(如chmod 755 /data/docker),避免容器因权限问题无法写入。 -
监控告警
对数据盘设置磁盘使用率告警,防止意外写满。
✅ 总结
| 项目 | 系统盘 | 数据盘 |
|---|---|---|
| 用途 | OS、Docker 程序、临时文件 | 容器数据、数据库、日志 |
| 容量 | 小(易满) | 大(可扩展) |
| 安全性 | 低(满则服务中断) | 高(独立备份、迁移) |
| 性能 | 一般 | 可选高性能云盘 |
| 推荐放置 | ❌ 持久化数据 | ✅ 所有持久化数据 |
结论:Docker 的持久化数据务必放在数据盘,Docker 守护进程本身可安装在系统盘。
云知识CLOUD