追記
この記事は2021/03/28に執筆しました。
しかし2021/03/30現在、改めてvolumeを作成したところ、WSL2のターミナル上から確認できるようになりました。
ディレクトリ:/var/lib/docker/volumes
環境は全く変わっていません。謎です。
はじめに
volumeについて学ぼうとした矢先です。
Linuxと全然挙動が違う+日本語の記事がなさそうなので書きました。
あと、仕組みを全然理解できないです。
よく言われているWindowsOS上のディレクトリをコンテナ上にバインドマウントする際の注意とは異なります。
問題
- WSL2上で作った名前付きボリュームが消える
別の言い方をすると、
- そこにあるって書いてあるのに、そこを見に行ったら"なかった"
結論
Windowsファイルシステム上の以下のディレクトリにある。
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
エクスプローラーでアクセスしてみてください。
前提
まず環境は以下です。
WSL(version1)での確認はしていません。
- OS
- Windows 10 Pro 20H2 build 19042.867
- WSL2
- Ubuntu 20.04.2 LTS
- Docker
- 20.10.5, build 55c4c88
- Docker Desktop for Windows
- 3.2.2
発生状況
docker volume create GOMI
で名前付きボリューム"GOMI"を作成
docker volume inspect GOMI
でどこに作られたか確認し
[
{
"CreatedAt": "2021-03-28T03:00:15Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/GOMI/_data",
"Name": "GOMI",
"Options": {},
"Scope": "local"
}
]
"Mountpoint": "/var/lib/docker/volumes/GOMI/_data",
とあるので、(これはLinuxのデフォでも同じディレクトリに保存されるので特に問題はなし)
# cd /var/lib/docker/volumes
# ll
total 40
drwx-----x 2 root root 4096 Mar 10 00:18 ./
drwx--x--x 12 root root 4096 Mar 10 00:18 ../
brw------- 1 root root 0, 2 Mar 10 00:18 backingFsBlockDev
-rw------- 1 root root 32768 Mar 10 00:18 metadata.db
あるはずの場所にありません。(動かしてるのはroot権限です)
しかし、docker volume ls
上では確かにあります。
# docker volume ls
DRIVER VOLUME NAME
local GOMI
それで調べたのですが、Qiitaや他のサイトに投稿されているものは「ホスト上のCドライブをコンテナにマウントする際の注意事項」等しかなさそうでしたので…
結論こちらが参考になりました。というか答えが載ってました。
WSL2 where is docker volume location? · Discussion #4176 · microsoft/WSL
解決方法
Windowsのエクスプローラーで、下記にアクセスしてください。
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
WSL2上で
$ cd /mnt/wsl/docker-desktop-data/version-pack-data
としても何も表示されないので気をつけてください。
一番簡単なアクセスの方法は「Windowsキー + R」のファイル名を指定して実行で
\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
と打ってEnterです。
エクスプローラーに打っても同じです。
なぜこうなってるのか
恐らくWindowsOS上でLinuxを動かす上で仕方のない仕組みなんでしょうが知識がないため全くわかりません。
↓この方が言ってますが
WSL2 where is docker volume location? · Discussion #4176 · microsoft/WSL
Maybe in WSL2 way, data only exists in Windows systems.
When we use WSL2 based engine, Docker Desktop mount "docker.sock" into Linux "/var/run/docker.sock". >Linux docker client access to windows docker service.
I find this idea in below link: https://blog.csdn.net/qqhappy8/article/details/106819429
でもマウントされた場所ってどうやって見つけられるんですか?せめてシンボリックリンクでもあると思ったんですが
最後に
This is... not simple. I don't know why it's this hard.
:これは...単純じゃない。なぜこんなにも難しいのかわからない。
関係ないですけど、今どきは英語圏のページだけじゃなく中国語も学んで中国語のページも検索できれば効率的に情報を集めれるなと思いました。