直接给结论:强烈建议放在数据盘(非系统盘)。
除非你的业务只是用来跑个 Hello World 或者做极轻量的测试,否则生产环境里把 Docker 容器数据、镜像和日志扔在系统盘上,属于典型的“自杀式”运维行为。
下面拆解一下为什么,以及怎么操作最稳妥。
1. 核心逻辑:隔离风险与成本
-
系统盘(/dev/vda1)是“命根子”
阿里云 ECS 的系统盘通常只有 40GB-100GB。Docker 是个吞金兽,尤其是当你开始拉取镜像、产生日志、挂载卷的时候,空间消耗是以 GB 甚至 TB 为单位增长的。- 场景 A:磁盘满了。如果你把 Docker 数据放在系统盘,一旦爆满,整个操作系统都会卡死,SSH 连不上,服务全挂。你只能远程进救援模式去删文件,极其被动。
- 场景 B:重装系统。这是最痛的。如果你把所有东西都压在系统盘,下次因为安全漏洞或系统崩溃需要重装时,你得重新配置环境、重新拉镜像、重新迁移数据。而在数据盘上,只要挂载点不变,数据永远在那儿,重装系统只需几分钟恢复业务。
-
数据盘(/dev/vdb 等)是“保险箱”
数据盘独立于操作系统。即使系统崩了,数据盘里的文件完好无损。你可以随时卸载旧实例,挂载到新实例上,实现真正的“无状态部署”理念(虽然 Docker 本身强调无状态,但持久化数据必须存在别处)。
2. 性能考量:IO 分离
- 系统盘通常是云盘基础型或高效型,IOPS 有限。
- 数据盘可以选择 ESSD PL0/PL1/PL2 等高 IOPS 类型。
数据库、Redis、高频写入的日志应用,如果放在低配系统盘上,IO 延迟会直接拖垮业务性能。把 Docker 的数据目录指向高性能数据盘,能显著提升读写速度。
3. 正确做法:如何迁移?
别听那些“改 daemon.json 就完事”的简单教程,那容易出坑。标准流程如下:
第一步:停止 Docker 服务
sudo systemctl stop docker
第二步:确保数据盘已格式化并挂载
假设你的数据盘设备是 /dev/vdb,挂载到 /data。
# 格式化(如果是新盘)
mkfs.ext4 /dev/vdb
# 创建挂载点
mkdir -p /data
# 挂载
mount /dev/vdb /data
注意:记得在 /etc/fstab 里加上自动挂载配置,防止重启后丢失。
第三步:移动 Docker 数据目录
默认 Docker 数据在 /var/lib/docker。我们需要把它移到 /data/docker。
# 复制现有数据(保留权限)
sudo rsync -aP /var/lib/docker/ /data/docker/
# 验证一下大小是否一致
du -sh /var/lib/docker /data/docker
第四步:修改 Docker 配置
编辑 /etc/docker/daemon.json,添加 data-root 参数:
{
"data-root": "/data/docker"
}
注意:老版本 Docker 可能用 graph 参数,现在统一用 data-root。
第五步:启动并验证
sudo systemctl start docker
sudo docker info | grep "Docker Root Dir"
输出应该是 /data/docker。然后跑一个测试容器,看看能不能正常写数据。
4. 特殊情况:什么时候可以放系统盘?
只有一种情况:你的容器全是无状态的,且数据全部通过外部存储(如 OSS、NAS、RDS)管理,容器本身不存任何持久化数据。
比如:
- 纯前端静态页面 Nginx 容器。
- 微服务中只负责计算,结果实时返回,不落地文件的进程。
即便如此,镜像层依然会占用系统盘空间。所以,为了管理方便,我还是建议哪怕只放镜像,也尽量指向数据盘,避免系统盘被镜像缓存撑爆。
5. 避坑指南
- 不要直接用符号链接(symlink):网上有些教程让你
mv到别处再建软链。这在 Docker 新版本中可能导致权限问题或 SELinux 冲突,直接用data-root是最干净的方式。 - 日志也要管:Docker 的默认日志驱动是
json-file,会把容器日志写到宿主机磁盘。如果日志量大,同样会撑爆系统盘。建议在daemon.json中限制日志大小:{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }或者改用
fluentd、loki等将日志转发到外部系统。 - 备份策略:数据盘不等于自动备份。定期快照数据盘,或者使用阿里云云盘备份功能。
总结
- 系统盘:装 OS、装软件、装 Docker 引擎本身。
- 数据盘:装 Docker 数据(镜像、容器层)、装持久化数据(数据库文件、上传附件)、装应用日志。
别省那点数据盘的钱,也别省那点迁移的时间。一次正确的架构设计,能省去后续无数次的救火。
CLOUD云计算