根本原因是Docker 27+卷管理器仅首次挂载时读取文件系统容量,后续块设备扩容不触发重检测;必须重启dockerd才能刷新元数据,否则df -h始终显示旧容量。
宿主机文件系统扩容后,容器内 df -h 仍显示旧容量,根本原因不是 docker 没“看到”,而是它压根不主动刷新——docker 27+ 的卷管理器只在首次挂载时读取一次文件系统容量,后续块设备扩容完全不触发重检测。
确认底层扩容是否真实生效
先排除虚扩:在宿主机执行
-
查块设备容量:
sudo dumpe2fs -h /dev/vg0/lv-dockervol | grep "Block count"—— 输出值必须比扩容前增大 -
查挂载点归属:
docker volume inspect myvol | jq '.[0].Mountpoint'得到路径(如/var/lib/docker/volumes/myvol/_data),再用findmnt -T /var/lib/docker/volumes/myvol/_data确认该路径确实挂载在你刚扩容的设备上 -
查内核是否识别新大小:
cat /sys/block/vg0-lv-dockervol/size(单位扇区),换算后应与预期一致
强制 Docker 重新加载容量元数据
Docker 27 不支持热刷新,必须让守护进程重读设备状态:
- 执行
sudo systemctl restart docker—— 注意:这会终止所有运行中容器,请提前停服或做迁移 - 重启后,
docker volume inspect myvol中的CreatedAt时间会更新,且容器内df -h应立即反映新容量 - 若跳过重启、仅尝试
umount & mount手动重挂载,Docker 卷元数据仍缓存旧值,df不变
绕过重启的临时方案(仅限紧急场景)
若无法接受服务中断,可手动同步挂载点,但需确保容器已停止:
- 停容器:
docker stop mycontainer - 卸载卷目录:
sudo umount /var/lib/docker/volumes/myvol/_data - 重新挂载(指定同一设备):
sudo mount /dev/vg0/lv-dockervol /var/lib/docker/volumes/myvol/_data - 启动容器:
docker start mycontainer—— 此时df -h可见新空间,但下次 Docker 重启后仍需重复此操作
预防下次扩容失效的关键配置
长期运维建议从机制上规避:
- 升级前确认 Docker 版本行为:26.x 每次挂载都调用
statfs(),27.0+ 必须重启 dockerd 才能更新容量缓存 - 在自动化脚本中,把
systemctl restart docker明确作为扩容流程的最后一步 - 避免使用
noatime,nodiratime等挂载选项干扰 ext4 元数据感知(虽非直接原因,但会加剧排查难度)

















