服务器磁盘爆满?5分钟搞定Docker数据迁移到新硬盘(CentOS 7实战)
·
服务器磁盘爆满?5分钟搞定Docker数据迁移到新硬盘(CentOS 7实战)
凌晨三点收到告警短信时,我的第一反应是检查监控系统——不是CPU飙高,不是内存泄漏,而是最让人头疼的磁盘空间告急。作为运维人员,这种场景再熟悉不过:/var/lib/docker目录像黑洞一样吞噬了所有空间,而业务容器还在持续产生日志。本文将分享我在CentOS 7环境下实现Docker零停机迁移的完整操作链,从磁盘分区到服务恢复,每个步骤都经过生产环境验证。
1. 紧急状况诊断与预处理
先用df -h确认磁盘使用情况时,你会看到类似这样的输出:
/dev/vda1 40G 39G 0 100% /
当Use%达到95%以上,Linux会主动触发磁盘写保护。此时需要立即执行以下应急措施:
- 清理临时文件:
sudo find /var/log -type f -name "*.log" -size +100M -exec truncate -s 0 {} \; - 检查Docker磁盘占用:
sudo du -sh /var/lib/docker/* - 暂停非关键容器(可选):
docker pause $(docker ps -q | head -n 3)
注意:直接删除Docker文件可能导致数据损坏,迁移才是根本解决方案
2. 新磁盘配置全流程
假设服务器已安装未挂载的/dev/vdb磁盘,我们需要完成以下操作链:
2.1 磁盘分区与格式化
使用fdisk进行分区时,建议采用全盘单分区方案:
sudo fdisk /dev/vdb
交互式操作序列:
- 输入
n创建新分区 - 选择
p主分区 - 三次回车使用默认参数
- 输入
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容器数据的迁移,期间订单服务零中断。关键在于提前准备好操作清单,并按步骤严格执行。
更多推荐
所有评论(0)