Windows docker起動エラー（WSL2 利用）

WindowsのDockerか起動エラー（コンテナ起動前）が発生した場合に さまざまなケースがあり、この対応で解決できる　という情報にたどりつけない。
そこで、見直す、参考にする事項をいくつかあげています。

かれこれ、WindowsでDocker起動できないのは 3回ありました。
Mac数年使っていて Docker for Macで docker が起動できない事象に遭遇したことはないです。

:::note info
この記事は、まあまあアクセスがあるみたいですが、Windows11やWSLバージョンが変わったりして、情報が古くなっています。

:::

## 2025-02-19追記
### 2025-02-19 Windows 11 Businessで遭遇した事象
- 事象：docker desktop startでfailになる。以下のログ見てもログエラーらしい情報がない
```
%APPDATA%\Docker\log.txt
%USERPROFILE%\.docker\daemon.json
C:\ProgramData\Docker\logs
```

- docker desktopがstartしようとしてWindowsの右下のタスクでは実行中のような表示のまま。Quitできない。
- winodwsのサービスで`com.docker.service`は起動する、サービス再起動でも起動する
- OS再起動しても変わらない
- 何かおかしい状況が以下コマンド結果で出てきた
```
>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2
  docker-desktop         Uninstalling    2
  docker-desktop-data    Stopped         2
```

上記のコマンド結果で、Docker Desktopはインストールしているがかれこれ1-2年くらいは再インストールしてないし、アンイストールしていないし、インストールもしていない。STATEが削除中なのか、存在しないのか、インストールエラーなのかわからない。壊れてるように見える。

### 解決できたときの対応

1️⃣. Uninstalling になっているものを解除する
```
>wsl --unregister docker-desktop
登録解除。
この操作を正しく終了しました。
```
解除後、以下のようになり一覧に表示されなくなる。
```
>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Stopped         2
  docker-desktop-data    Stopped         2
```
2️⃣. コマンドプロンプトを管理者モードで起動して Dockerサービスを停止する。
```
>net stop com.docker.service
Docker Desktop Service サービスを停止中です.
Docker Desktop Service サービスは正常に停止されました。
```
3️⃣. wslをアップデート
```
>wsl --update
更新プログラムを確認しています。
Linux 用 Windows サブシステムをバージョンに更新しています: 2.4.11。
```
4️⃣. Windows OSを再起動し、自動でのサービス起動でDocker Desktop起動を待つ
```
>wsl --version
WSL バージョン: 2.4.11.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5716
Windows バージョン: 10.0.26100.3194

>wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2
  docker-desktop         Running         2
```
5️⃣. 正常起動された
この後に、Docker Desktop再起動でstartのFailがなくなりRunningになった。


---

ここから、過去の情報で、以下が記事更新前の情報です。
最終更新日 2021年12月15日
投稿日 2021年06月03日

## この記事書いたときの バージョン

```
PS > systeminfo

OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.19042 N/A ビルド 19042
OS 製造元:              Microsoft Corporation
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: Intel64 Family 6 Model 165 Stepping 5 GenuineIntel ~2901 Mhz
BIOS バージョン:        American Megatrends Inc. M.008, 2020/06/24

Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

|  ソフト |バージョンやサイズ  |
| ---- | ---- |
| Docker Desktop Installer.exe | v3.3.3|
| wsl_update_x64.msi|作成日時 ‎2021‎年‎3‎月‎3‎日、‏‎14:46:58、サイズ 14.5 MB (15,282,176 バイト)|
| NoLsp.exe| サイズ 1.43 MB (1,501,104 バイト)、WSL2とdockerならば使わなくても良い、WSL2 ubuntuの場合に使う|




## ログ・ファイル、エラーログ
- ログファイルの場所
`C:\Users\your-account\AppData\Local\Docker` , `%USERPROFILE%\AppData\Local\Docker`
    - log.txt  最新のログファイル
    - log.66.txt, log.67.txt, log.68.txt のようにローテーションされるため対応前後のファイルが必要になることがあるのでファイルをどこにかにコピーしておく

- ログエラーのサンプル

**あくまでも一例です**

```
[13:15:31.034][LoggingMessageHandler][Info   ] [a61e2e22] <BackendAPIClient start> POST http://backend/dns/refresh-hosts
[13:15:31.250][WSL2Provisioning  ][Info   ] Checking docker-desktop
[13:15:31.254][LoggingMessageHandler][Info   ] [a61e2e22] <BackendAPIClient end> POST http://backend/dns/refresh-hosts -> 204 NoContent (took 219ms)
[13:15:31.310][WSL2Provisioning  ][Info   ] deploying WSL distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro
[13:15:31.446][WSL2Provisioning  ][Error  ] Failed to deploy distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: c?[U0?0_0?0?0L0??d0K0?0~0[0?00


 stderr: 
[13:15:31.449][LinuxWSL2Engine   ][Info   ] Stopping windows side processes
[13:15:31.492][LinuxWSL2Engine   ][Info   ] Stopping engine
[13:15:31.524][LoggingMessageHandler][Info   ] [1dfcf536] <BackendAPIClient start> POST http://backend/windowsfeatures/check
[13:15:31.863][CliInstaller      ][Info   ] Reading build information from appcast
[13:15:31.912][LoggingMessageHandler][Info   ] [1dfcf536] <BackendAPIClient end> POST http://backend/windowsfeatures/check -> 200 OK (took 387ms)
[13:15:31.962][Updater           ][Debug  ] Finished check for updates
[13:15:32.146][LinuxWSL2Engine   ][Info   ] Terminating lingering processes and wsl distros and patching host file
[13:15:32.146][LoggingMessageHandler][Info   ] [a6104593] <BackendAPIClient start> POST http://backend/dns/refresh-hosts
[13:15:32.162][LoggingMessageHandler][Info   ] [a6104593] <BackendAPIClient end> POST http://backend/dns/refresh-hosts -> 204 NoContent (took 16ms)
[13:15:32.197][WSL2Provisioning  ][Info   ] Checking docker-desktop
[13:15:32.197][WSL2Provisioning  ][Info   ] deploying WSL distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro
[13:15:32.330][WSL2Provisioning  ][Error  ] Failed to deploy distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: c?[U0?0_0?0?0L0??d0K0?0~0[0?00


 stderr: 
[13:15:32.330][LinuxWSL2Engine   ][Info   ] Stopping windows side processes
[13:15:32.364][LinuxWSL2Engine   ][Info   ] Stopping engine
[13:15:32.387][EngineStateMachine][Debug  ] sending state Docker.ApiServices.StateMachines.FailedToStartState to state change sink
[13:15:32.387][EngineStateMachine][Debug  ] State Docker.ApiServices.StateMachines.FailedToStartState sent to state change sink
[13:15:32.387][EngineStateListener][Debug  ] received state Docker.ApiServices.StateMachines.FailedToStartState from LinuxWSL2
[13:15:32.388][EngineStateNotificationRecorder][Debug  ] Registered state {"State":"failed to start","Mode":"linux","date":1622693732}
[13:15:32.463][SystrayNotifications][Error  ] System.InvalidOperationException: Failed to deploy distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: c?[U0?0_0?0?0L0??d0K0?0~0[0?00


 stderr: 
   場所 Docker.ApiServices.WSL2.WslShortLivedCommandResult.LogAndThrowIfUnexpectedExitCode(String prefix, ILogger log, Int32 expectedExitCode) 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.ApiServices\WSL2\WslCommand.cs:行 146
   場所 Docker.Engines.WSL2.WSL2Provisioning.<DeployDistroAsync>d__17.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\WSL2Provisioning.cs:行 169
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.Engines.WSL2.WSL2Provisioning.<ProvisionAsync>d__8.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\WSL2Provisioning.cs:行 78
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__26.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\LinuxWSL2Engine.cs:行 102
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:行 29
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行 67
--- 直前に例外がスローされた場所からのスタック トレースの終わり ---
   場所 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   場所 Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() 場所 C:\workspaces\PR-15766\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:行 92
[13:15:32.473][GUI               ][Info   ] Sending Bugsnag report 35ebbca3-b758-46f6-9b0f-2dd97c5f903d...
[13:15:33.020][GUI               ][Info   ] Bugsnag report 35ebbca3-b758-46f6-9b0f-2dd97c5f903d sent
[13:15:33.021][SegmentApi        ][Info   ] Usage statistic: eventCrash
[13:15:33.023][Diagnostics       ][Warning] Starting to gather diagnostics as User : 'C:\Program Files\Docker\Docker\resources\com.docker.diagnose.exe' gather.
[13:15:33.161][Engines           ][Error  ] Start failed with Failed to deploy distro docker-desktop to C:\Users\your-account\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: c?[U0?0_0?0?0L0??d0K0?0~0[0?00
```

## 見直すべき事項

- WLS2用の設定をカスタマイズしている場合
`C:\Users\your-account\.wslconfig` （`%UserProfile%¥.wslconfig`） のファイル内の記載に間違いがないか？
https://docs.microsoft.com/ja-jp/windows/wsl/wsl-config#configuration-options にドキュメントがあるので見直す


## dockerアンインストールでの注意点
- dockerをアンインストールすると、コンテナのファイル
 `C:\Users\your-account\AppData\Local\Docker\wsl`( `%USERPROFILE%\AppData\Local\Docker` ) の中のフォルダのファイルを消してしまうので、必要ならばバックアップしておく。`data\ext4.vhdx` では 10GBくらいは普通にありえる。

## WSL2とDocker Desktopを入れ直す
- dockerを入れ直しても解決しないことが多々あります
- dockerインストールでは、インストール時にWSL2の必須コンポーネントを同時に入れるケースと、そのオプションをチェックoffにしてインストールするケースがあります
- WSL2を使えるようにする、コントロールパネル→プログラムと機能→　にある「Windowsの機能を有効化または無効化」でも、幾度かやっても解決できないことがあります

---

## 調査するときの参考サイトと説明

### WSL2をアンインストールしてMS公式のWindows10にインストールして、ubuntuのコンテナを使う例です

- https://docs.microsoft.com/ja-jp/windows/wsl/install-win10 の通り入れるのですが、入れ直す場合は、削除しておくものがあります。

#### アンインストール・削除
- PC設定　-> アプリ -> アプリと機能 -> 「このリストを検索」で ubuntu 入力して、ubuntuが見つかったら「アンインストール」を行う
 
- Docker Desktop：Docker Desktop Installer.exeで入れたもの
`コントロール パネル\すべてのコントロール パネル項目\プログラムと機能` にてアンインストール

- Windows Subsystem for Linux Update ：wsl_update_x64.msiで入れたもの
`コントロール パネル\すべてのコントロール パネル項目\プログラムと機能`にてアンインストール

-  `コントロール パネル\すべてのコントロール パネル項目\プログラムと機能`のWindowsの機能の有効化または無効化にて、
    - Hype-V ：チェックoff
    - Linux用Windows サブシステム（表記違う可能性あり）：チェックoff
    - 仮想マシンプラットフォーム：チェックoff

参考の画面（チェックONなので、offにする必要がある）
![windowsの機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/20dffb62-ce6d-7eff-9168-db1bda01582b.png)

- 上記のチェックoffで進めて、OS再起動します

#### インストール
- その後に入れ直しとして、MS公式手順で進める。
MS公式は、管理者で PowerShell を開いてコマンド入力しています、そのコマンドはGUI画面での`Windowsの機能の有効化または無効化`で、チェックON（有効にする）の代わりをコマンドで行っています。
再起動タイミングを間違えないこと


- MS公式手順での `手順 6 - 選択した Linux ディストリビューションをインストールする` は、インストールできても、起動でエラー`0x80070003` が出たら、MSストアから入れるのを諦める、または、https://github.com/microsoft/WSL/issues/3232 を参考にしてみる
 

## ワークアラウンド

### 対応例１）
WSL2を入れるまではMS公式手順とほぼ同じで、その後の `docker desktop`インストールでのWSL2オプションをチェックoffにして入れる

### 対応例２）
`WSL2 backend always crash System.InvalidOperationException: Failed to deploy distro docker-desktop #7208` https://github.com/docker/for-win/issues/7208 にある、https://github.com/docker/for-win/issues/7208#issuecomment-643697540 の対応で動くこともあります

### 対応例３）
https://github.com/docker/for-win/issues/8204の https://github.com/docker/for-win/issues/8204#issuecomment-683377496 の対応

ワークアラウンドの手順（「仮想マシンプラットフォーム」は無効化と有効化はしていない。docker起動エラーのワークアラウンドのため、おそらく有効化の前提かと思われる）

```
As a workaround to get Docker working on a Windows Insider build.

Uninstall Docker and WSL 2 kernel.
Go to the Control Panel -> Programs -> Turn Windows features on or off
Uncheck the following: Containers, Hyper-V, Windows Subsystem for Linux
Restart the system
Install Docker without the WSL2 enabled/checked in the first screen
Go to the Control Panel -> Programs -> Turn Windows features on or off
Turn on/check the Windows Subsystem for Linux
Restart the system.
Do not install the WSL2 Kernel.
```
docker-desktopのインストールの最初で、` Install required Windows components for WSL 2` のチェックoff（の日本語相当忘れてしまったけど、）にしてインストールする

このケースの場合の他の対応例
https://stackoverflow.com/questions/66026771/my-docker-is-failing-to-launch-on-my-windows-10-pro



### 対応例４）For information on key differences with WSL 2 please...

```
PS> wsl --set-default-version 2

For information on key differences with WSL 2 please visit https://aka.ms/wsl2
```

WSL2をデフォルトに設定するコマンドで上記のようになる（Error にはならない）
ひとまず、そのまま使う

### 対応例５）wslコマンドがおかしい、マイクロストアからダウンロードした WSL2 ubuntu が起動でおかしい

- wsl_update_x64.msi インストール前

```
>wsl
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
```

- wsl_update_x64.msi インストールすると、メッセージが変わる

```
>wsl
実行しようとした操作は、参照したオブジェクトの種類ではサポートされていません。
```

ただ、wsl_update_x64.msiをインストールしただけでは動かない

- https://insider.10bace.com/2020/09/02/docker-desktop-crash-on-wsl2-backend/ 
- https://github.com/MicrosoftDocs/WSL/issues/547

上記２つのURLをもとに、

https://www.proxifier.com/tmp/Test20200228/NoLsp.exe

↑をダウンロードしてきて `c:\app\NoLsp.exe` に置いたとして powershellを管理者として実行して、exeを実行する。実行には「.\」が必要。

- NoLsp.exeの実行例

```
PS C:\app> .\NoLsp.exe c:\windows\system32\wsl.exe
Success!
```

その後に、cmdコマンドプロンプト wsl コマンドを実行すると、

```
Users\test>wsl
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Wed Mar  3 15:19:59 JST 2021

  System load:  0.0                Processes:             8
  Usage of /:   0.4% of 250.98GB   Users logged in:       0
  Memory usage: 0%                 IPv4 address for eth0: 192.168.144.93
  Swap usage:   0%

1 update can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable


The list of available updates is more than a week old.
To check for new updates run: sudo apt update


This message is shown once a day. To disable it please create the
/root/.hushlogin file.
```

これで、`wsl -l -v`  や wsl2のubuntuが正常に使える


## その他

### WSL2では、Hyper-V とは共存しない

https://github.com/docker/for-win/issues/6640#issuecomment-687304908
の通り、WSL2使うならば、Hyper-V はチェックoff であること


### ubuntuをMSストアから入れず、docker desktopだけインストールされている状態のwslでは

WSL2とdockerが紐づけられている

```
PS > wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  docker-desktop         Running         2

```