服务器磁盘爆满?5分钟搞定Docker数据迁移到新硬盘(CentOS 7实战)

凌晨三点收到告警短信时,我的第一反应是检查监控系统——不是CPU飙高,不是内存泄漏,而是最让人头疼的磁盘空间告急。作为运维人员,这种场景再熟悉不过:/var/lib/docker目录像黑洞一样吞噬了所有空间,而业务容器还在持续产生日志。本文将分享我在CentOS 7环境下实现Docker零停机迁移的完整操作链,从磁盘分区到服务恢复,每个步骤都经过生产环境验证。

1. 紧急状况诊断与预处理

先用df -h确认磁盘使用情况时,你会看到类似这样的输出:

/dev/vda1        40G   39G     0 100% /

当Use%达到95%以上,Linux会主动触发磁盘写保护。此时需要立即执行以下应急措施:

  1. 清理临时文件
    sudo find /var/log -type f -name "*.log" -size +100M -exec truncate -s 0 {} \;
    
  2. 检查Docker磁盘占用
    sudo du -sh /var/lib/docker/*
    
  3. 暂停非关键容器(可选):
    docker pause $(docker ps -q | head -n 3)
    

注意:直接删除Docker文件可能导致数据损坏,迁移才是根本解决方案

2. 新磁盘配置全流程

假设服务器已安装未挂载的/dev/vdb磁盘,我们需要完成以下操作链:

2.1 磁盘分区与格式化

使用fdisk进行分区时,建议采用全盘单分区方案:

sudo fdisk /dev/vdb

交互式操作序列:

  1. 输入n创建新分区
  2. 选择p主分区
  3. 三次回车使用默认参数
  4. 输入w写入分区表

接着格式化为ext4文件系统:

sudo mkfs.ext4 -L docker_data /dev/vdb1

参数说明:

  • -L 设置卷标便于识别
  • 默认块大小4096字节适合容器存储

2.2 持久化挂载配置

创建挂载点并设置权限:

sudo mkdir /mnt/docker_data
sudo chmod 711 /mnt/docker_data

获取磁盘UUID并写入/etc/fstab

UUID=$(sudo blkid -s UUID -o value /dev/vdb1)
echo "UUID=$UUID /mnt/docker_data ext4 defaults,noatime 0 0" | sudo tee -a /etc/fstab

关键挂载参数解析:

参数作用推荐值
noatime减少元数据写入必须启用
nodiratime目录访问不更新atime建议启用
barrier确保文件系统一致性默认1

立即挂载测试:

sudo mount -a

3. Docker数据迁移实战

3.1 服务暂停与数据转移

优雅停止Docker服务:

sudo systemctl stop docker.socket
sudo systemctl stop docker

使用rsync代替mv命令更安全:

sudo rsync -avzP /var/lib/docker/ /mnt/docker_data/

验证数据一致性:

sudo diff -r /var/lib/docker /mnt/docker_data | wc -l

3.2 配置深度调整

修改Docker守护进程配置:

// /etc/docker/daemon.json
{
  "data-root": "/mnt/docker_data",
  "storage-driver": "overlay2",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

关键参数说明:

  • data-root 必须与挂载点绝对路径一致
  • max-size 限制容器日志体积
  • storage-driver 必须与原配置相同

3.3 服务恢复与验证

重新加载配置并启动服务:

sudo systemctl daemon-reload
sudo systemctl start docker

验证迁移结果:

docker info | grep "Docker Root Dir"
docker volume ls

4. 高级维护与故障排查

4.1 原磁盘清理策略

安全删除旧数据(确认服务正常运行后):

sudo rm -rf /var/lib/docker/*

建议保留目录结构:

sudo mkdir -p /var/lib/docker/{volumes,network,swarm}

4.2 常见问题解决方案

问题1:容器启动报权限错误

sudo chcon -R -t container_file_t /mnt/docker_data

问题2:fstab挂载失败 检查dmesg日志:

dmesg | grep -i ext4

问题3:磁盘性能下降 启用SSD优化参数:

echo "noop" | sudo tee /sys/block/vdb/queue/scheduler

4.3 监控与自动化建议

添加Zabbix监控项:

vfs.fs.size[/mnt/docker_data,pused]

设置Crontab定期清理:

0 3 * * * docker system prune -f --filter "until=72h"

最后分享一个真实案例:某电商平台大促期间,通过这套方法在7分钟内完成200GB容器数据的迁移,期间订单服务零中断。关键在于提前准备好操作清单,并按步骤严格执行。

更多推荐