在阿里云服务器上,关于 Docker 容器数据应该放在系统盘还是数据盘,强烈建议将 Docker 的数据目录挂载到数据盘(云盘),而不是默认的系统盘。
以下是详细分析和建议:
✅ 推荐方案:Docker 数据放在数据盘
原因:
-
系统盘空间有限且昂贵
- 阿里云 ECS 实例的系统盘通常较小(如 40GB~100GB),且 IOPS 和吞吐量可能不如独立数据盘优化得好。
- Docker 镜像、容器层、日志、卷数据等会快速消耗磁盘空间,容易撑爆系统盘,导致服务不可用或无法启动新容器。
-
数据安全与备份策略不同
- 系统盘常用于存放操作系统、配置文件等,重装系统时可格式化。
- 数据盘可单独快照备份、扩容、迁移,更适合持久化存储业务数据。
- 若 Docker 数据在系统盘,一旦误操作重装系统,所有容器数据将丢失。
-
性能更优
- 数据盘(尤其是 ESSD 云盘)可提供更高的 IOPS 和吞吐,适合数据库、日志写入等高 IO 场景。
- 避免系统负载高时影响 Docker 读写性能。
-
便于管理和扩展
- 可独立对数据盘进行监控、告警、扩容。
- 方便后续迁移容器数据到新服务器(只需挂载数据盘并恢复 Docker 配置)。
❌ 不推荐:Docker 数据放在系统盘
- 默认情况下,Docker 会将
/var/lib/docker放在系统盘根目录下。 - 随着镜像拉取、容器运行、日志积累,系统盘极易满,引发严重问题:
- 容器无法创建或启动
- 主机磁盘满导致系统异常
- 日志轮转失败,占用大量空间
🛠️ 如何正确配置?
方法一:修改 Docker 默认存储路径(推荐)
-
停止 Docker 服务:
sudo systemctl stop docker -
假设你已有一块数据盘
/dev/vdb,格式化为 ext4/xfs 并挂载到/data:sudo mkfs.ext4 /dev/vdb sudo mkdir -p /data sudo mount /dev/vdb /data # 设置开机自动挂载(写入 /etc/fstab) echo '/dev/vdb /data ext4 defaults 0 0' | sudo tee -a /etc/fstab -
修改 Docker daemon 配置:
编辑/etc/docker/daemon.json(若不存在则创建):{ "data-root": "/data/docker" } -
重启 Docker:
sudo systemctl start docker -
验证:
docker info | grep "Docker Root Dir" # 应输出:/data/docker
⚠️ 注意:此操作会清空原有 Docker 数据(镜像、容器等),如需保留,请先将原数据复制到新位置再迁移。
方法二:使用 Docker Volume 绑定到数据盘
对于特定应用(如 MySQL、Redis),可直接将数据卷挂载到数据盘:
# docker-compose.yml 示例
services:
mysql:
image: mysql:8
volumes:
- /data/mysql:/var/lib/mysql
📌 最佳实践总结
| 项目 | 建议 |
|---|---|
| Docker 根目录 | 挂载到数据盘(如 /data/docker) |
| 容器日志 | 可考虑单独挂载或限制大小 |
| 数据库/文件存储 | 必须使用数据盘 |
| 系统盘 | 仅存放 OS、Docker 二进制、配置 |
| 备份策略 | 对数据盘定期快照,系统盘按需备份 |
🔒 额外建议
- 启用 Docker 日志轮转,防止日志占满磁盘:
// /etc/docker/daemon.json { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - 监控磁盘使用情况,设置告警阈值(如 >80%)。
- 使用阿里云云盘快照功能定期备份数据盘。
✅ 结论:务必将 Docker 数据存储路径指向数据盘,以保障稳定性、安全性和可扩展性。
云服务器