努力
奋斗

阿里云服务器docker容器应该放在系统盘还是数据盘?

服务器价格表

直接给结论:强烈建议放在数据盘(非系统盘)。

除非你的业务只是用来跑个 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. 避坑指南

  1. 不要直接用符号链接(symlink):网上有些教程让你 mv 到别处再建软链。这在 Docker 新版本中可能导致权限问题或 SELinux 冲突,直接用 data-root 是最干净的方式。
  2. 日志也要管:Docker 的默认日志驱动是 json-file,会把容器日志写到宿主机磁盘。如果日志量大,同样会撑爆系统盘。建议在 daemon.json 中限制日志大小:
    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }

    或者改用 fluentd、loki 等将日志转发到外部系统。

  3. 备份策略:数据盘不等于自动备份。定期快照数据盘,或者使用阿里云云盘备份功能。

总结

  • 系统盘:装 OS、装软件、装 Docker 引擎本身。
  • 数据盘:装 Docker 数据(镜像、容器层)、装持久化数据(数据库文件、上传附件)、装应用日志。

别省那点数据盘的钱,也别省那点迁移的时间。一次正确的架构设计,能省去后续无数次的救火。