DockerDesktop(Windows)がおかしくなってしまったのでWSLコマンドを調べながら再インストールしたお話。
お恥ずかしい話、Docker(特にWindowsのDockerDesktop)を今まであまり活用せず、半年くらい前からようやくなんとなく使っていたねこてっくです。
色々あって再インストールを余儀なくされたので、備忘録もあわせて残しておきます。
これからインストールをする人や、デフォルトのまま使っていてCドライブが枯渇しそうな人の参考になればと思います。
何があったのか
先日BunJSの記事を書いた後に、Windowsの方でも計測してみようと色々触っていたところ、
CLI(WindowsTerminal)でdocker ps -a
やdocker images
は正常にレスポンスがあったのですが、いつの間にかDockerDesktopのGUIでコンテナとイメージが正常に読み込まれないような状態になりました。(同期が取れていない…?)
時間をかけて調べてみたり復旧を試みましたが、それも叶わずとても悔しいですが原因は不明のままです。
もしも再発して原因が分かれば追記もしくは記事を起こそうと思います。
作業開始
前提
今回の作業環境は以下の通りです。
- Windows10 Professional(21H2)
- 異常発生中のDockerDesktop(4.12.0)
- Windows PowerShell(admin) with WindowsTarminal
- 残量の豊潤なデータ用HDD
DockerDesktopのアンイストールとクリーンナップ
アンインストール作業はWindowsの設定->アプリからちゃちゃっとしちゃいます。
完了後、おかしくなったデータが残っていたりしないかwsl -l -v
コマンドでチェックします。
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Stopped 2
docker-desktop-data Stopped 2
もの見事に残っていますね…[1]
アンインストール前はdocker-desktop
とdocker-desktop-data
が存在していて、データの方だからか消えていませんでした。[2]
残したまま再インストールしておかしくなったら嫌なのでdocker-desktop-data
は削除します。
今回はデータの復旧を諦めているので、バックアップは取りません。[3]
PS C:\> wsl --unregister docker-desktop-data
登録を解除しています...
再確認してなくなっていればOK!
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Stopped 2
ここでおまじないレベルで再起動をしておきました。
インストーラーのダウンロードとインストール
Docker公式のDockerDesktopダウンロードページより行います。
Also available for Windows and Linux
と記載のあるところのWindowsのリンクからダウンロードですね。
ダウンロード完了後、実行ファイルからインストール。
確か途中でWSL2を使う
的なチェック項目があったと思いますが、脳死疲れ切った状態で作業を行っていたのでメモ取り忘れました。
あと、初回インストールの時はPowerShellの管理者権限でなにかコマンドを入れた覚えもありますが、その辺りは沢山記事があるので良いかな…
初回起動
一旦DockerDesktopを起動して、docker-desktop
とdocker-desktop-data
を作ってもらいます。
起動完了後、タスクトレイからQuit Docker Desktop
を選択し終了。
データディレクトリに.vhdx
ファイルが存在するか確認します。
初期設定では%LocalAppData%\Docker\wsl
配下にdata\ext4.vhdx
とdistro\ext4.vhdx
があると思います。
個人的にはインストール時にディストリビューションのデータディレクトリをとりあえず%LocalAppData%
にしないで、選択式にして欲しいものです。
DockerDesktopのデータディレクトリ移動
移動前チェック
移動する前にWSLが止まっているかwsl -l -v
コマンドでチェックします。
PS C:\> wsl -l -v
NAME STATE VERSION
* Ubuntu-22.04 Stopped 2
docker-desktop Stopped 2
docker-desktop-data Stopped 2
ちゃんと止まっていますね。
バックアップ(export)
それでは移動させていきます。
今回はCドライブのまま利用せず、D:\wsl
に移動させようと思います。
ですので、移動先ディレクトリや引数に関しては自分の環境にあわせて読み替えてください。
移動先のディレクトリ作成と移動をします。
PS C:\> mkdir d:\wsl
PS C:\> cd d:\wsl
そして、現在のデータをエクスポートします。
PS D:\wsl> wsl --export docker-desktop D:\wsl\docker-desktop.tar
PS D:\wsl> wsl --export docker-desktop-data D:\wsl\docker-desktop-data.tar
docker-desktop-data
の方はサイズが大きいので多少時間がかかると思います。
現在のデータディレクトリの登録解除(unregister)
最初のクリーンナップで使ったコマンドを再度やります。
PS D:\wsl> wsl --unregister docker-desktop
登録を解除しています...
PS D:\wsl> wsl --unregister docker-desktop-data
登録を解除しています...
新しいデータディレクトリで再登録(import)
PS D:\wsl> wsl --import docker-desktop D:\wsl\docker-desktop D:\wsl\docker-desktop.tar --version 2
PS D:\wsl> wsl --import docker-desktop-data D:\wsl\docker-desktop-data D:\wsl\docker-desktop-data.tar --version 2
最後にwsl -l -v
コマンドで移動前と同じ状態になっていればOKです。
最終確認
DockerDesktopを起動して正常に起動すれば問題なしです。
お試しコンテナを起動して確認してみましょう。
PS D:\wsl> docker run -d -p 80:80 docker/getting-started
1a1c5d63c5736f3b98d9c19c839147bbabcc750c700b0045531baa99e3863402
ちゃんとコンテナのハッシュ値が返ってきましたので、DockerDesktopのContainersとImagesがCLIの結果と同期が取れているか確認して終わりました。
PS D:\wsl> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a1c5d63c573 docker/getting-started "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:80->80/tcp brave_engelbart
PS D:\wsl> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest cb90f98fd791 5 months ago 28.8MB
昔のものは消えちゃったけど、ちゃんと動くようになったー!!
最後に
本当に何が起こったのか今回は分からずじまいだったので、再発時は原因追求したいものです。
DockerDesktopが難しいのか、私の理解が追いついていないのか…
自分の取り扱う環境で分からないことが存在したり、トラブルシューティングが出来ないことが一番悔しいねこてっくでした。
おまけ
今回使用したWSLコマンドを整理
wsl --help
より抜粋
使用法: wsl.exe [Argument] [Options...] [CommandLine]
--list, -l [Options]
ディストリビューションの一覧を表示します。
オプション:
--verbose, -v
すべてのディストリビューションに関する詳細な情報を表示します。
--shutdown
直ちに、すべての実行中の配布および WSL 2
軽快なユーティリティの仮想マシンを終了します。
--unregister <Distro>
ディストリビューションの登録を解除し、ルートファイルシステムを削除します。
--export <Distro> <FileName>
ディストリビューションを tar ファイルにエクスポートします。
ファイル名には、標準出力として - を使用できます。
--import <Distro> <InstallLocation> <FileName> [Options]
指定した tar ファイルを新しいディストリビューションとしてインポートします。
ファイル名には標準入力として - を使用できます。
オプション:
--version <Version>
新しいディストリビューションに使用するバージョンを指定します。
今回使用したコマンド以外に--set-default-version
コマンドや--set-version
コマンドもあったので、後からWSLディストリビューションのVersionも変更出来るのだと思います。(未検証)
Discussion