WSL Docker 迁移 Volume 到 Linux


看了一堆 Volume 迁移的教程,麻烦死。其实操作逻辑很简单,找到源主机的 docker volume 目录(一般在 /var/docker/volumes/ ),在目标端建立同名的volume,停掉两端的docker,从源把目录 rsync 到目标。

Windows 11 + WSL2 + Docker。

操作步骤如下

1 找到 Docker 的数据盘 VHDX。

我自己的磁盘被迁移到了 D盘,如果不知道在哪儿,一般在用户目录,例如 C:\Users\sskaje\AppData\Local\Docker,这个目录下 distro 是程序的镜像,data是数据的镜像。

如果还不在这里,Windows 11 可以使用任务管理器 -> 性能 右上角… -> 资源监视器 -> CPU,在关联的句柄里搜索 vhdx,然后操作docker,例如 系统托盘退出docker 再打开,或者打开docker-desktop 的界面,乱点点。

2 退出 Docker Desktop。

3 在 WSL 里 手动加载 Docker Desktop 的数据盘。

wsl.exe -d Debian --mount --vhd D:/WSL/Docker/data/ext4.vhdx --bare --name docker-data-1

参考 https://www.sskaje.me/2023/08/13/wsl-mount-external-vhdx-disk/,找到 docker 数据盘可能的磁盘,我这里是 sdd,直接挂载。

mkdir docker-data
mount /dev/sdd docker-data/

于是,在 docker-data/data/docker/volumes 里能找到正常 docker volumes 目录里的所有文件。

cd docker-data/data/docker/volumes

4 (新terminal窗口)在目标主机上建立对应的volumes,然后关掉 docker。

以 gogs-data 为例,在目标主机上执行

docker volume create gogs-data
/etc/init.d/docker stop

5 从源 WSL 里,rsync 目录

rsync -av gogs-data root@192.168.11.11:/var/lib/docker/volumes/

执行完成后,在目标主机上启动 docker

/etc/init.d/docker start

如果有多个volume要迁移,迁移完所有的volume之后再start。

6 目标 Linux 启动对应的docker。

例如我的 gogs

docker run --detach --name=gogs -p 10022:22 -p 10880:3000 -v gogs-data:/data gogs/gogs

再用浏览器访问 192.168.11.11:10880,用之前的凭据登录,一切正常。

7 收拾残局。

很遗憾,WSL 2 我不知道怎么正确地 unmount Disk ,我尝试 linux 里 umount 再从外边 wsl --unmount DISK,失败,只能用 wsl --unmount 卸载全部。


Leave a Reply

Your email address will not be published. Required fields are marked *