😭

DockerDesktop(Windows)がおかしくなってしまったのでWSLコマンドを調べながら再インストールしたお話。

2022/09/29に公開

お恥ずかしい話、Docker(特にWindowsのDockerDesktop)を今まであまり活用せず、半年くらい前からようやくなんとなく使っていたねこてっくです。
色々あって再インストールを余儀なくされたので、備忘録もあわせて残しておきます。
これからインストールをする人や、デフォルトのまま使っていてCドライブが枯渇しそうな人の参考になればと思います。

何があったのか

先日BunJSの記事を書いた後に、Windowsの方でも計測してみようと色々触っていたところ、
CLI(WindowsTerminal)でdocker ps -adocker imagesは正常にレスポンスがあったのですが、いつの間にかDockerDesktopのGUIでコンテナとイメージが正常に読み込まれないような状態になりました。(同期が取れていない…?)
時間をかけて調べてみたり復旧を試みましたが、それも叶わずとても悔しいですが原因は不明のままです。
もしも再発して原因が分かれば追記もしくは記事を起こそうと思います。

作業開始

前提

今回の作業環境は以下の通りです。

  • Windows10 Professional(21H2)
    • 異常発生中のDockerDesktop(4.12.0)
    • Windows PowerShell(admin) with WindowsTarminal
  • 残量の豊潤なデータ用HDD

DockerDesktopのアンイストールとクリーンナップ

アンインストール作業はWindowsの設定->アプリからちゃちゃっとしちゃいます。
完了後、おかしくなったデータが残っていたりしないかwsl -l -vコマンドでチェックします。

PowerShell
PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Stopped         2
  docker-desktop-data    Stopped         2

もの見事に残っていますね…[1]
アンインストール前はdocker-desktopdocker-desktop-dataが存在していて、データの方だからか消えていませんでした。[2]

残したまま再インストールしておかしくなったら嫌なのでdocker-desktop-dataは削除します。
今回はデータの復旧を諦めているので、バックアップは取りません。[3]

PowerShell
PS C:\> wsl --unregister docker-desktop-data
登録を解除しています...

再確認してなくなっていればOK!

PowerShell
PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-22.04           Stopped         2

ここでおまじないレベルで再起動をしておきました。

インストーラーのダウンロードとインストール

Docker公式のDockerDesktopダウンロードページより行います。
https://www.docker.com/products/docker-desktop/

Also available for Windows and Linuxと記載のあるところのWindowsのリンクからダウンロードですね。

ダウンロード完了後、実行ファイルからインストール。
確か途中でWSL2を使う的なチェック項目があったと思いますが、脳死疲れ切った状態で作業を行っていたのでメモ取り忘れました。
あと、初回インストールの時はPowerShellの管理者権限でなにかコマンドを入れた覚えもありますが、その辺りは沢山記事があるので良いかな…

初回起動

一旦DockerDesktopを起動して、docker-desktopdocker-desktop-dataを作ってもらいます。
起動完了後、タスクトレイからQuit Docker Desktopを選択し終了。

データディレクトリに.vhdxファイルが存在するか確認します。
初期設定では%LocalAppData%\Docker\wsl配下にdata\ext4.vhdxdistro\ext4.vhdxがあると思います。
個人的にはインストール時にディストリビューションのデータディレクトリをとりあえず%LocalAppData%にしないで、選択式にして欲しいものです。

DockerDesktopのデータディレクトリ移動

移動前チェック

移動する前にWSLが止まっているかwsl -l -vコマンドでチェックします。

PowerShell
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に移動させようと思います。
ですので、移動先ディレクトリや引数に関しては自分の環境にあわせて読み替えてください。

移動先のディレクトリ作成と移動をします。

PowerShell
PS C:\> mkdir d:\wsl
PS C:\> cd d:\wsl

そして、現在のデータをエクスポートします。

PowerShell
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)

最初のクリーンナップで使ったコマンドを再度やります。

PowerShell
PS D:\wsl> wsl --unregister docker-desktop
登録を解除しています...
PS D:\wsl> wsl --unregister docker-desktop-data
登録を解除しています...

新しいデータディレクトリで再登録(import)

PowerShell
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を起動して正常に起動すれば問題なしです。
お試しコンテナを起動して確認してみましょう。

PowerShell
PS D:\wsl> docker run -d -p 80:80 docker/getting-started
1a1c5d63c5736f3b98d9c19c839147bbabcc750c700b0045531baa99e3863402

ちゃんとコンテナのハッシュ値が返ってきましたので、DockerDesktopのContainersとImagesがCLIの結果と同期が取れているか確認して終わりました。

PowerShell
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も変更出来るのだと思います。(未検証)

脚注
  1. Ubuntu-22.04は今回関係ないのでノータッチです。 ↩︎

  2. これが正しい動きのかは調べられていません… ↩︎

  3. ディレクトリの移動をされる方は先にexportしてください。 ↩︎

Discussion