1. 为什么需要迁移Docker存储位置
刚接触Docker的新手可能不知道,默认情况下Docker会把所有镜像、容器、卷和网络配置都存储在/var/lib/docker目录。这个设计在早期没什么问题,但随着使用时间增长,你会发现系统盘空间被快速吞噬。我去年就遇到过一台服务器因为Docker占满根分区导致系统崩溃的情况。
迁移Docker的data-root目录主要有三个典型场景:
- 系统盘空间不足(特别是云服务器默认只有40G系统盘)
- 需要将数据存储到性能更好的磁盘(比如把/var/lib/docker挂载到SSD)
- 企业环境需要统一存储到NAS或专用存储服务器
2. 迁移前的关键准备工作
2.1 检查当前Docker存储配置
首先用这个命令查看当前data-root位置:
bash复制docker info | grep "Docker Root Dir"
在我的测试机上输出是:
code复制 Docker Root Dir: /var/lib/docker
2.2 计算现有数据量
执行以下命令查看当前Docker占用空间:
bash复制sudo du -sh /var/lib/docker
重要提示:如果数据量超过10GB,建议在业务低峰期操作,大型迁移可能需要30分钟以上
2.3 准备目标目录
假设我们要迁移到/data/docker:
bash复制sudo mkdir -p /data/docker
sudo chown root:root /data/docker
sudo chmod 0711 /data/docker
3. 完整迁移操作步骤
3.1 停止Docker服务
bash复制sudo systemctl stop docker
sudo systemctl stop docker.socket
注意:确保所有容器都已停止,可以用
docker ps -a检查
3.2 迁移数据文件
使用rsync进行可靠复制:
bash复制sudo rsync -avxP /var/lib/docker/ /data/docker/
参数说明:
-a:归档模式,保留所有属性-v:显示进度-x:不跨越文件系统边界-P:显示进度条和断点续传
3.3 修改Docker配置
编辑或创建配置文件:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"data-root": "/data/docker"
}
EOF
3.4 重启Docker服务
bash复制sudo systemctl daemon-reload
sudo systemctl start docker
4. 验证与故障排查
4.1 验证新存储位置
bash复制docker info | grep "Docker Root Dir"
应该显示:
code复制 Docker Root Dir: /data/docker
4.2 常见问题解决
问题1:权限错误
code复制Got permission denied while trying to connect to the Docker daemon socket
解决方案:
bash复制sudo chmod 666 /var/run/docker.sock
问题2:存储空间不一致
新旧目录大小不一致可能是rsync未完成,可以:
bash复制sudo rsync -avxP --delete /var/lib/docker/ /data/docker/
问题3:镜像/容器丢失
如果发现数据异常,可以临时改回原配置:
bash复制sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak
sudo systemctl restart docker
5. 高级配置与优化建议
5.1 使用LVM精简配置
对于生产环境,建议使用LVM管理Docker存储:
bash复制sudo lvcreate -L 100G -n docker-lv vg00
sudo mkfs.xfs /dev/vg00/docker-lv
sudo mount /dev/vg00/docker-lv /data/docker
5.2 定期清理旧数据
设置定时任务每月清理:
bash复制0 3 1 * * docker system prune -af --volumes
5.3 存储驱动选择
在daemon.json中可指定存储驱动:
json复制{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
6. 实际迁移案例参考
最近帮某电商客户迁移的实战数据:
- 原目录大小:147GB
- 迁移耗时:2小时15分钟
- 使用的rsync命令:
bash复制sudo rsync -avxPS --stats /var/lib/docker/ /data/docker/
关键技巧:
- 添加
--stats查看传输统计 - 使用
-S选项处理稀疏文件 - 通过
ionice -c 3降低IO优先级避免影响业务
迁移后性能提升:
- 容器启动时间从4.2s降至1.8s
- 镜像拉取速度提升30%