Docker 目录迁移脚本【Windows Junction 类型链接】

Docker 目录迁移脚本完整教程:从诞生到自动化使用

一、脚本诞生背景与开发历程

1. 为什么需要迁移 Docker 目录?

  • 系统盘空间压力:Docker 镜像和容器数据通常存储在C:\Users\用户名目录下,随着使用时间增长会占用大量系统盘空间
  • 数据管理需求:将数据迁移到专用存储盘(如 D 盘)便于统一管理和备份
  • 性能优化:部分用户希望将 I/O 密集型的 Docker 数据转移到高速磁盘(如 NVMe 固态硬盘)

2. 从批处理到 PowerShell 的技术升级

【笔记】 Docker目录迁移脚本-CSDN博客

  • 初代批处理脚本局限
    • 仅支持基础文件操作,缺乏错误处理机制
    • 无法优雅处理路径中的空格和特殊字符
    • 符号链接创建命令mklink /J需手动处理权限问题
  • PowerShell 升级优势
    • 面向对象的编程模型,支持复杂逻辑处理
    • 内置try-catch异常捕获,提升脚本健壮性
    • New-Item -Junction命令更规范的符号链接创建方式
    • 自动环境变量解析,减少手动配置

3. 关键技术点实现

  • 符号链接技术:使用 Windows Junction 类型链接,实现路径透明映射
  • 自动化备份流程:脚本自动完成 "备份 - 迁移 - 恢复" 全流程
  • 跨版本兼容:通过.NET原生 API 实现 PowerShell 5.1 到 7.0 + 的版本兼容
  • 权限验证:内置管理员权限检测,避免因权限不足导致操作失败

建议在安装 Docker Desktop 前运行,或者在干净的卸载 Docker Desktop 并清理残留文件及文件夹后运行(重装前)。

【安全有效新方案】WSL 默认路径迁移实战:通过 PowerShell 符号链接实现自动重定向-CSDN博客 

二、自动化用户名获取方案

1. 脚本核心改进:自动获取当前用户名

# 自动获取当前Windows用户名(无需手动修改)
$USERNAME = $env:USERNAME

  • 原理:通过$env:USERNAME环境变量动态获取当前登录用户
  • 优势:
    • 彻底避免手动修改用户名的错误
    • 支持多用户环境自动适配
    • 兼容中英文用户名场景

2. 完整改进后的脚本

@echo off
cls
echo ============= Docker目录迁移工具 =============
echo 警告:请先关闭Docker Desktop,并以管理员身份运行此脚本!
echo ============================================
pause:: 自动获取当前用户名(核心改进)
set USERNAME=%USERNAME%
echo 检测到当前用户:%USERNAME%
pause:: 配置参数(仅需修改目标路径)
set BACKUP_DIR=E:\DockerBackup :: 备份目录(建议非系统盘)
set DEST_DIR=D:\DockerData     :: 目标存储目录(可自定义,如D:\Program\Docker):: 自动生成路径变量
set SRC_CONFIG=C:\Users\%USERNAME%\.docker
set SRC_DATA=C:\Users\%USERNAME%\AppData\Local\Docker
set DEST_CONFIG=%DEST_DIR%\.docker
set DEST_DATA=%DEST_DIR%\Docker:: 检查管理员权限
net session >nul 2>&1
if %errorLevel% neq 0 (echo 错误:请右键选择"以管理员身份运行"此脚本!pauseexit
):: 步骤1:创建备份目录
echo ---------- 步骤1:准备备份目录 ----------
if not exist "%BACKUP_DIR%" (mkdir "%BACKUP_DIR%"echo 已创建备份目录:%BACKUP_DIR%
) else (echo 备份目录已存在:%BACKUP_DIR%
)
pause:: 步骤2:备份原始目录
echo ---------- 步骤2:备份原始目录 ----------
echo 正在备份.docker配置目录...
if exist "%SRC_CONFIG%" (xcopy "%SRC_CONFIG%" "%BACKUP_DIR%\.docker" /E /Y /I /Q
)echo 正在备份Docker镜像数据目录...
if exist "%SRC_DATA%" (xcopy "%SRC_DATA%" "%BACKUP_DIR%\Docker" /E /Y /I /Q
)
echo 备份完成!路径:%BACKUP_DIR%
pause:: 步骤3:创建目标目录
echo ---------- 步骤3:创建目标目录 ----------
if not exist "%DEST_DIR%" (mkdir "%DEST_DIR%"
)
if not exist "%DEST_CONFIG%" (mkdir "%DEST_CONFIG%"
)
if not exist "%DEST_DATA%" (mkdir "%DEST_DATA%"
)
echo 目标目录已创建:%DEST_DIR%
pause:: 步骤4:删除源目录
echo ---------- 步骤4:删除源目录 ----------
if exist "%SRC_CONFIG%" (rmdir "%SRC_CONFIG%" /S /Q
)
if exist "%SRC_DATA%" (rmdir "%SRC_DATA%" /S /Q
)
echo 源目录已删除
pause:: 步骤5:创建符号链接
echo ---------- 步骤5:创建符号链接 ----------
mklink /J "%SRC_CONFIG%" "%DEST_CONFIG%"
mklink /J "%SRC_DATA%" "%DEST_DATA%"
echo 符号链接创建完成!
echo  原配置目录 %SRC_CONFIG% 已链接到 %DEST_CONFIG%
echo  原镜像目录 %SRC_DATA% 已链接到 %DEST_DATA%
pause:: 步骤6:恢复备份数据
echo ---------- 步骤6:恢复备份数据 ----------
echo 正在恢复.docker配置...
if exist "%BACKUP_DIR%\.docker" (xcopy "%BACKUP_DIR%\.docker" "%DEST_CONFIG%" /E /Y /I /Q
)echo 正在恢复Docker镜像数据...
if exist "%BACKUP_DIR%\Docker" (xcopy "%BACKUP_DIR%\Docker" "%DEST_DATA%" /E /Y /I /Q
)
echo 数据恢复完成!
pause:: 完成提示
echo ============= 迁移完成! =============
echo 请重启电脑后再启动Docker Desktop,确保符号链接生效。
echo =====================================
pause

三、详细使用教程 

1. 准备工作

  1. 关闭 Docker Desktop:托盘图标右键选择 "Quit Docker Desktop"
  2. 检查磁盘空间
    • 目标盘(如 D 盘)需有与原 Docker 数据相当的可用空间
    • 备份盘(如 E 盘)建议预留至少 10GB 空间
  3. 确认 PowerShell 版本
    • 运行$PSVersionTable.PSVersion
    • 最低要求:5.1(Windows 10 内置)

2. 脚本获取与保存

 

  1. 获取脚本
    • 复制本文提供的完整脚本
    • 注意完整复制

    •  
  2. 保存脚本
    • 打开记事本或 VSCode
    • 粘贴脚本后另存为docker_migrate.ps1 或 docker_migrate.bat
    • 保存路径建议:D:\ 或 C:\Users\$USERNAME\Documents 或 桌面
    • 确保文件后缀为.ps1 或 .bat,编码为UTF-8

 

 

3. 执行脚本步骤

命令行执行
  1. 以管理员身份打开 PowerShell
  2. 切换到脚本目录:

    cd "D:\保存路径"  # 例如:cd D:\Users\love\Desktop
    
  3. 执行脚本:

    .\docker_migrate.ps1
    

或双击运行 docker_migrate.bat

 

 

4. 执行策略设置(首次使用需操作)

若遇到以下错误:

无法加载文件,因为在此系统上禁止运行脚本。

执行以下命令(临时允许脚本执行):

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass

执行完脚本后可恢复默认策略:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Restricted

 

 

四、迁移过程解析与验证

1. 脚本执行流程详解

  1. 环境检测阶段
    • 自动获取当前用户名
    • 验证管理员权限
    • 检查备份目录和目标目录
  2. 数据迁移阶段
    • 备份原.docker配置和镜像数据
    • 创建目标目录结构
    • 删除原目录(保留符号链接位置)
    • 创建 Junction 符号链接
    • 恢复数据到目标目录
  3. 完成提示阶段
    • 提示重启电脑使链接生效
    • 等待用户按键退出

2. 迁移结果验证

方法一:图形界面验证
  1. 打开文件资源管理器
  2. 导航到C:\Users\$USERNAME\.docker
  3. 右键新建一个空白文本文档
  4. 在目标储存 D:\DockerData\.docker 中查看是否同步存在该文本文档
  5. 验证后删除该无用文档
方法二:命令行验证
  1. 检查符号链接类型:

    Get-Item "C:\Users\$USERNAME\.docker" | Select-Object LinkType
    

    输出应为:LinkType: Junction
  2. 验证 Docker 数据路径:

    docker info | Select-String "Docker Root Dir"
    

    输出应包含:D:\DockerData\Docker
方法三:Docker Desktop 验证
  1. 重启电脑后启动 Docker Desktop
  2. 点击菜单 "Settings" → "Resources"
  3. 在 "File Sharing" 选项卡中,确认数据路径为D:\DockerData\Docker

五、高级技巧与问题解决

1. 自定义路径方案

  • 场景 1:将数据迁移到移动硬盘
    修改$DEST_BASE为移动硬盘路径(如E:\DockerStorage
  • 场景 2:按磁盘类型分类存储
    配置目录放 SSD:$DEST_DOCKER_CONFIG = "D:\SSD\.docker"
    镜像数据放 HDD:$DEST_DOCKER_DATA = "E:\HDD\Docker"

2. 常见问题解决方案

问题 1:符号链接创建失败
  • 原因:权限不足或原目录未删除
  • 解决
    1. 确认以管理员身份运行
    2. 手动删除C:\Users\$USERNAME\.docker目录(确保 Docker 已关闭)
    3. 重新执行脚本
问题 2:Docker 启动报错
  • 原因:链接未生效或数据损坏
  • 解决
    1. 确认已重启电脑
    2. 检查D:\DockerData\.docker\config.json中的data-root字段
    3. 若损坏,可从备份目录E:\DockerBackup恢复数据
问题 3:备份 / 恢复失败
  • 原因:磁盘空间不足或路径错误
  • 解决
    1. 清理目标磁盘空间
    2. 确保$BACKUP_DIR$DEST_BASE路径中没有中文或特殊字符
    3. 检查路径是否存在空格(PowerShell 会自动处理,但批处理需要引号)

3. 脚本扩展建议

  • 添加磁盘空间检测:在脚本开头添加磁盘空间检查功能
  • 增加日志记录:将操作日志写入文件,便于问题排查
  • 支持交互式路径输入:通过Read-Host命令让用户动态输入路径
  • 集成 Docker 服务控制:自动停止 / 启动 Docker 服务,避免手动操作

六、安全与最佳实践

1. 数据安全措施

  1. 双重备份机制
    • 脚本自动备份到$BACKUP_DIR
    • 建议手动复制一份到其他存储设备
  2. 关键操作确认
    • 可修改脚本添加Read-Host "确认执行请按Y"之类的确认步骤
  3. 权限最小化
    • 执行完脚本后及时恢复 PowerShell 执行策略为Restricted

2. 性能优化建议

  • 使用硬链接替代符号链接
    • 对于 Windows 10 1809 + 系统,可尝试硬链接:

      New-Item -ItemType HardLink -Path $SRC_DOCKER_CONFIG -Value $DEST_DOCKER_CONFIG
      
  • 启用 NTFS 压缩(非 WSL存储分区才建议压缩,WSL 不支持压缩分区)
    • 对目标目录启用 NTFS 压缩,减少存储空间占用:

      compact /c /s $DEST_BASE
      

  • 定期清理无用镜像
    • 迁移完成后执行:

      docker system prune -a -f
      

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86852.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86852.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-ai 工作流

目录 工作流概念工作流程图spring-boot 编码定义节点 (Node)定义节点图StateGraphcontroller测试浏览器测试用户输入 工作流概念 工作流是以相对固化的模式来人为地拆解任务,将一个大任务拆解为包含多个分支的固化流程。工作流的优势是确定性强,模型作为…

重头开始学ROS(6)---Eigen库安装与使用

Eigen库 矩阵运算是一种非常重要的运算方式,在Matlab中,矩阵运算可以轻松的实现,但在C这种偏底层的语言中,若不借助第三方库,矩阵运算需要我们进行较为复杂的代码设计。Eigen库是一个用于线性运算的C模板库&#xff0…

【STM32】外部中断

STM32 外部中断(EXTI)概述 这篇文章结合示例代码,系统性地讲述 STM32 外部中断(EXTI)实验的原理、以及配置流程。目的在于辅助读者掌握STM32F1 外部中断机制。 STM32F1xx官方资料:《STM32中文参考手册V10》…

LeetCode Hot100 算法题 (矩阵篇)

1、73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]// 将第一行…

Flutter基础(项目创建)

一、使用命令行创建项目 1. 确认 Flutter 环境正常 要保证 Flutter SDK 已经正确安装,并且环境变量配置无误。可以通过执行以下命令来验证: flutter doctor 要保证所有检查项都显示绿色对勾,要是有问题,可按照提示进行修复。 …

【Actix Web】Rust Web开发实战:Actix Web框架全面指南(2025企业级应用版)

​ 在2025年高并发、低延迟成为Web服务核心指标的背景下,​​Actix Web凭借异步Actor模型与零成本抽象​​,成为Rust生态中生产环境部署率最高的Web框架。本指南深入解析Actix Web 4.0核心技术,覆盖​​百万级并发架构设计​​、​​内存安全…

HTML之常用基础标签

HTML之常用基础标签 一、HTML文档基本结构标签1. <html>标签2. <head>标签3. <body>标签 二、文本相关基础标签1. 标题标签&#xff08;<h1> - <h6>&#xff09;2. 段落标签&#xff08;<p>&#xff09;3. 换行标签&#xff08;<br>…

外键列索引优化:加速JOIN查询的关键

在使用数据库时&#xff0c;特别是在执行涉及JOIN操作的查询时&#xff0c;优化外键列的索引是非常重要的。外键通常用于建立表之间的关联&#xff0c;而JOIN操作则是基于这些外键列来实现的。下面是一些关键步骤和技巧&#xff0c;可以帮助你优化外键列的索引&#xff0c;从而…

2025年 UI 自动化框架使用排行

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 </

【软考高项论文】论信息系统项目的整体管理

摘要 在信息系统项目的管理中&#xff0c;整体管理处于核心地位&#xff0c;对项目全局规划与协调起着关键作用&#xff0c;保障项目各阶段目标一致且高效执行。本文结合作者参与的 2024 年 6 月启动的信息系统项目&#xff0c;深入探讨项目整体管理的过程&#xff0c;着重阐述…

(4)Wireshark捕获设置

1.简介 WireShark的强大之处就在于不用你再做任何配置就可以抓取http或者https的包。主要是讲解和分享如何使用WireShark抓包。 2.运行Wireshark 安装好 Wireshark 以后&#xff0c;就可以运行它来捕获数据包了。方法如下&#xff1a; 1.在 Windows 的“开始”菜单中&#…

智慧校园电子班牌系统源码的开发与应用,基于Java/SpringBoot后端、Vue2前端、MySQL5.7数据库

智慧校园系统源码&#xff0c;智慧班牌源码&#xff0c;java语言 技术栈&#xff1a; ‌后端开发‌&#xff1a;采用Java语言和Spring Boot框架进行开发。Java是一种广泛使用的、面向对象的编程语言&#xff0c;而Spring Boot是基于Spring框架的快速应用开发框架&#xff0c;能…

工程优化——WebSocket、WSS(WebSocket Secure)和SSE(Server-Sent Events)通信对比

WebSocket、WSS&#xff08;WebSocket Secure&#xff09;和SSE&#xff08;Server-Sent Events&#xff09;是三种常见的实时通信技术&#xff0c;它们的核心区别在于通信方向、协议实现、数据格式和适用场景。以下是分维度的详细解释&#xff0c;并附带Python示例和应用场景选…

【TiDB 社区智慧合集】 TiDB x 运营商|掌上营业厅、账务、物联网等多核心业务场景的实战应用案例

作者&#xff1a; Billmay表妹 原文来源&#xff1a; https://tidb.net/blog/bb1467af 在信息基础设施国产化战略加速落地的背景下&#xff0c;电信及广电领域正迎来数据库国产化替代的关键转型期。TiDB 凭借自身技术创新优势&#xff0c;深度携手各大运营商&#xff0c;以全…

Java 17 下 Spring Boot 与 Pulsar 队列集成实战:生产者与消费者实现指南

Pulsar队列与Springboot集成有2种模式&#xff1a;官方pulsar-client 或社区Starter&#xff08;如pulsar-spring-boot-starter&#xff09; 如果考虑最新、最快、最齐全的功能&#xff0c;使用官方pulsar-client如果考虑快速低成本接入&#xff0c;使用社区Starter&#xff0…

《Go语言高级编程》RPC 入门

《Go语言高级编程》RPC 入门 一、什么是 RPC&#xff1f; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是分布式系统中不同节点间的通信方式&#xff0c;允许程序像调用本地函数一样调用远程服务的方法。 Go 语言的标准库 net/rpc 提供了基础的…

第N5周:Pytorch文本分类入门

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 一、前期准备 1.加载数据 import torch import torch.nn as nn import torchvision from torchvision import transforms,datasets import os,PIL,p…

uniappx 安卓app项目本地打包运行,腾讯地图报错:‘鉴权失败,请检查你的key‘

根目录下添加 AndroidManifest.xml 文件&#xff0c; <application><meta-data android:name"TencentMapSDK" android:value"腾讯地图申请的key" /> </application> manifest.json 文件中添加&#xff1a; "app": {"…

【向上教育】结构化面试开口秘籍.pdf

向 上 教 育 XI A N G S H A N G E D U C A T I O N 结构化 面试 开口秘笈 目 录 第一章 自我认知类 ........................................................................................................................... 2 第二章 工作关系处理类 .......…

Webpack 热更新(HMR)原理详解

&#x1f525; Webpack 热更新&#xff08;HMR&#xff09;原理详解 &#x1f4cc; 本文适用于 Vue、React 等使用 Webpack 的项目开发者&#xff0c;适配 Vue CLI / 自定义 Webpack 项目。 &#x1f3af; 一、什么是 HMR&#xff1f; Hot Module Replacement 是 Webpack 提供的…