WSL2 Docker desktop の volume 実体
SQL環境構築の際の下調べで躓いた。
結論:全てのコンテナの実体は"%LocalAppData%\Docker\wsl\data\ext4.vhdx" と "%LocalAppData%\Docker\wsl\distro\ext4.vhdx" の中にある。
SQLデータを永続化する為に、ホストのどこかにデータをマウントする必要性はすぐ分かった。しかしながらWSL 2では完全なLinuxカーネルを使用する事から、そのデメリットとして Linux -> Windows のデータ参照や抽出が非常に遅いらしい。ファイルシステムが違うので当然だ。
この現象はWSL2 Engineを用いたDocker Desktopにも適用されるようで、公式ではWindowsのファイルシステムにマウントしないで別途 Volumeを作ってそちらにマウントするように記述がある。
Docker Desktop WSL 2 backend | Docker DocumentationのBest Practice抜粋。
Instead, from a Linux shell use a command like docker run -v ~/my-project:/sources <my-image> where ~ is expanded by the Linux shell to $HOME.
で、 $HOMEってどこよ?
UNIX系のMac環境ではVMが作成されその上のファイルシステム上にこれはあるらしい。しかしVMとはちょっと違うWSL 2 Engine Dockerでは、そもそもDocker自体がどのOS上で動いているのかもあやふやだ。まさにクラウド。実際にはHyper-V上にLinuxのVMがDockerの母体となっていると勝手に妄想しているが、このVMのターミナルを開く事やファイル構造を確認する事は叶わないようだ。
Docker曰く、ボリュームはDocker上で全て管理できるからどこにあるかは気にしなくてもいいよ。と。
VMだと create volume は非常に分かりやすくそれぞれのディスクファイルが作成された。しかしDockerでは一つの仮想ディスク上に集約されているようだ。その中を覗く事は叶わなかった。(できるよって人は教えてください)
そのディスクファイルが以下にある。
"%LocalAppData%\Docker\wsl\data\ext4.vhdx" "%LocalAppData%\Docker\wsl\distro\ext4.vhdx"
この中にコンテナが詰まってるのは確かなようで、恐らくVolumeもこの中にあるのだろう。
今のところハードドライブを指定して任意のディスクを収容とか器用な事はできそうもないので、可能な範囲の一番でっかいドライブにこのファイルを突っ込むしかなさそうだ。
参考記事
WSL2 Docker が PC のディスクを圧迫する - Qiita
WSL2 Dockerのイメージ・コンテナの格納先を変更したい (WSL2のvhdxファイルを移動させたい) - Qiita