Docker で WSL 2 エンジン有効化後、既存 Hyper-V ボリュームアクセス不可問題

まあ、当たり前と言えば当たり前なんですけどね。私は Docker に関して一般ユーザーなので、 ‘Use the WSL 2 based engine’ を有効化したとたんにこれまで使用できたボリュームにアクセスできなくなって焦りました。そんなときどうするかという話です。今更という感じの話題かも知れませんが…。

シナリオとしては以下の通りです。

  1. これまで Docker Desktop for Windows を Hyper-V backend で使用してきた。
  2. メリットが多いというので WSL 2 backend に切り替えた。
  3. 切り替えた後は既存ボリュームにアクセスできない!

さて、この時どうするかなのですが、まず焦らず もう一度 Hyper-V backend に戻します。backend を切り替えるだけでは Hyper-V 上の Docker サービス用 VM が削除されたりするわけではないので Docker Desktop で設定を元に戻せばこれまでの image や volume がまた使用できるようになります。

続いて volume の内容をエクスポートします。以下のように busybox を使用して Windows のファイルシステムと Docker ボリュームをマウントした後、ボリュームの内容を tar.gz ファイル on Windows ファイルシステムとしてエクスポートします。

(ボリュームを確認)
C:\>docker volume ls
 DRIVER    VOLUME NAME
 local     myvolume
(ボリュームをエクスポート)
C:\>docker run -v myvolume:/src -v C:\Temp:/dest -i -t busybox
 / # tar -zcvf /dest/volume-backup.tgz src
 / # exit

C:\>

あとは WSL 2 backend に切り替え新規ボリュームを作成してから .tgz を戻せばよいです。私の場合は WSL の Linux ファイルシステム上に適当に展開して ‘-v /home/blogger323/dockervol:/mnt’ のように bind mount するようにしました。

ちなみにですが、WSL 2 backend に切り替えた後のボリュームは以下のパスで Windows からアクセス可能です。

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes

参考情報:

Migrating existing containers from Hyper-V to WSL2 technology

追記: リソース消費量を抑えるには (2021.5.2)

WSL 2 を Docker エンジンとして選択すると、Docker 用の WSL distribution として以下のように docker-desktop、docker-desktop-data の 2つが新たに作成されます。

C:\>wsl.exe --list -v
  NAME                   STATE           VERSION
* Ubuntu                 Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2 

上のリストで Ubuntu は元から使っていた distribution ですが、WSL integration の設定でこの Ubuntu と Docker を統合すると Docker を使っているときはこれら 3つの WSL 環境が起動することになります。本文では WSL integration の設定を行う想定で bind mount するとしましたが、WSL 用メモリの使用量は多くなりがち (参考)なので統合せず Docker volume を作ることで起動する WSL 環境を docker 関連の 2つのみにするという選択肢もありだと思います。

その場合も、本文最後に書いたパスを用いて Windows から直接 volume 内のファイルにアクセスすることが可能です。

更に追記 (2021.5.15):
よく考えると Docker Desktop を使わずに WSL で Linux 版 Docker を動かせばよいような気がしてきました。