1. 为什么需要迁移Docker存储路径很多朋友刚开始用Docker时可能没注意系统默认会把所有镜像、容器、卷等数据都存在/var/lib/docker目录下。这个路径在大多数Linux发行版中都位于系统盘随着使用时间增长你会发现系统盘空间莫名其妙被吃光了。我去年就遇到过这种情况一台云服务器突然报警磁盘空间不足排查后发现/var/lib/docker目录竟然占用了40多GB当时紧急删除了些不用的镜像才缓解但根本解决方案还是要把这个数据大户迁移到专门的数据盘。系统盘爆满的危害无法创建新容器连docker pull都会失败系统日志无法写入严重时会导致系统崩溃影响其他系统服务的正常运行提示用df -h命令可以快速查看各分区使用情况docker info | grep Docker Root Dir能显示当前Docker存储路径。2. 迁移前的准备工作2.1 确认当前存储路径首先用以下命令查看当前配置docker info | grep Docker Root Dir典型输出Docker Root Dir: /var/lib/docker2.2 选择新存储位置理想的新位置应该满足位于单独的数据盘如/data、/mnt等有充足的空间建议至少预留50GB使用高性能存储SSD优于机械硬盘比如我通常会选择/mnt/docker_data # 用于数据盘挂载点 或 /home/docker # 家目录下的大容量分区2.3 停止Docker服务迁移前必须停止所有容器和服务systemctl stop docker docker.socket containerd确认服务已停止systemctl status docker | grep Active应该显示inactive (dead)3. 两种迁移方案对比3.1 方案一直接修改data-root推荐这是Docker官方推荐的方式通过修改/etc/docker/daemon.json配置文件实现创建新目录mkdir -p /mnt/docker_data chmod 700 /mnt/docker_data使用rsync同步数据保留原数据备份rsync -avxP /var/lib/docker/ /mnt/docker_data/注意-P参数显示进度大数据量迁移时很实用修改配置文件cat EOF | sudo tee /etc/docker/daemon.json { data-root: /mnt/docker_data, storage-driver: overlay2 } EOF3.2 方案二使用符号链接快速但不够规范适合临时解决方案mv /var/lib/docker /mnt/docker_data ln -s /mnt/docker_data /var/lib/docker虽然简单但可能遇到权限问题且某些工具可能不兼容符号链接。方案对比表特性修改data-root符号链接官方推荐✅❌需要修改配置✅❌兼容性最佳一般后续维护难度低中支持存储驱动切换✅❌4. 详细迁移步骤以方案一为例4.1 完整数据迁移使用rsync能确保数据完整性rsync -avxHS --progress --delete /var/lib/docker/ /mnt/docker_data/参数说明-a归档模式保留所有属性-v显示详细过程-x不跨越文件系统边界-H保留硬链接-S高效处理稀疏文件--progress显示进度--delete同步删除操作4.2 配置文件调整如果已有daemon.json只需添加>{ registry-mirrors: [https://registry.docker-cn.com], data-root: /mnt/docker_data, log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }4.3 处理SELinux问题如果系统启用了SELinux如CentOS需要执行chcon -R system_u:object_r:container_var_lib_t:s0 /mnt/docker_data5. 迁移后验证5.1 重启服务systemctl start docker5.2 检查新路径docker info | grep Docker Root Dir应显示新路径Docker Root Dir: /mnt/docker_data5.3 测试基本功能docker run --rm hello-world docker volume create test-vol docker image ls5.4 清理旧数据确认无误后rm -rf /var/lib/docker/*6. 常见问题排查问题1Docker启动失败检查日志journalctl -u docker -n 50 --no-pager常见原因配置文件JSON格式错误、权限不足、SELinux限制问题2容器无法访问卷解决方案确保新路径权限正确chmod -R 750 /mnt/docker_data问题3存储驱动不兼容如果之前使用aufs建议转换为overlay2{ storage-driver: overlay2, storage-opts: [ overlay2.override_kernel_checktrue ] }7. 高级技巧与优化建议7.1 使用LVM动态扩容对于物理服务器建议将数据盘设为LVM便于后续扩容pvcreate /dev/sdb vgcreate docker-vg /dev/sdb lvcreate -l 100%FREE -n docker-lv docker-vg mkfs.xfs /dev/docker-vg/docker-lv mount /dev/docker-vg/docker-lv /mnt/docker_data7.2 定期清理无用数据设置定时任务# 每周日凌晨3点清理 0 3 * * 0 docker system prune -af --volumes7.3 监控Docker磁盘使用添加Prometheus监控指标# prometheus.yml 配置示例 - job_name: docker static_configs: - targets: [docker-host:9323]迁移完成后我的服务器系统盘使用率从95%降到了30%再也不用担心半夜收到磁盘告警了。对于长期运行的Docker主机建议在初始化系统时就规划好存储分离避免后期迁移的麻烦。