Docker for Windowsが起動してくれないので、処方箋を調べて色々試してみた

# 前書き

最近はDocker動かすのにあまり環境を選ばなくなって、便利になってきました。

しかし、Macでは比較的安定してるDockerさん、Windowsでは未だかなり不安定です。

----

この度GPD WIN 2にDocker for Windowsをセットアップしてみたのですが、落ちる落ちる、というか一度たりともまともに起動できない、、😰

今回こちらを動かせるようにできましたので、レポートをまとめます。
皆さん参考にしていただければ幸いです。

----

# tl;dr

1. `C:\Program Files\Docker\Docker\resources` 配下のPowerShellスクリプトから、 `-ComputerName localhost` というキーワードを全て削除する
2. 同フォルダで `MobyLinux.ps1 -destroy && MobyLinux.ps1 -create` を実行する
3. Windowsを再起動する

----

# まずは普通にインストールしてみる

__64bit版__ の Windows __10 Proか、それ以上のエディション__ 前提です。Homeな方はマイクロソフトにお布施して、Proへ昇格してください。
32bit版や8.1以前な方、、アップグレードするか、Docker Toolboxで幸せになりましょう。

----

```PowerShell
PS Admin> choco install -y docker-desktop
```

私のPCではChocolateyをインストールしてるので、管理者権限のPowerShellでサクッとインストールしてしまいます。

----

## 結果

![2019-02-1019-8ca4cdf9-f096-4721-a49a-55fba67f1fa5.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/347102/b7a317d5-c078-b9cf-0d7d-ff2176207029.png)

----

赤面すれば許してくれるとでも思ったのでしょうか、このポンコツクジラめ、、😌

少なくとも私のGPD WIN 2では一度も起動してくれませんでした。

----

# Docker for WindowsとHyper-Vの再インストール

まず手始めに基本から、ということでDocker for WindowsとHyper-Vを再インストールします。順番は必ず次の順序で行います。

----

## 手順

1. Docker for Windowsのアンインストール
2. Hyper-Vのアンインストール
3. Hyper-Vのインストール
4. Docker for Windowsのインストール

----

Docker for WindowsはHyper-Vに依存しているためです。この順番を間違える、、例えばHyper-Vから先にアンインストールすると、こうなります。
![2019-02-1018-4a6e729a-aece-4619-a633-61132f96b0c7.37.48.png](https://qiita-image-store.s3.amazonaws.com/0/347102/f17abe69-2567-8fde-5b5c-3e31c0fcb390.png)

----

## Hyper-Vの再インストール

コマンドごとに再起動が必要なので注意。

```PowerShell
<# アンインストール(無効化) #>
PS Admin> Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

<# インストール(有効化) #>
PS Admin> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```

----

## 結果: 変化なし。

ついでなので、Docker for Windowsのリセットも試しましたが駄目です。

`Docker ErrorActionPreference` 辺りのワードでググってると、いくつか記事が出てきたので試してみます。

----

# Hyper-Vにおける制御フローガードが悪さしている可能性

まず一つ目は[Hyper-Vのvmcompute.exeに制御フローガードがかかって死ぬ可能性](https://qiita.com/k_akimoto/items/182418e2d200616e7db6)。

“Windowsセキュリティ アプリ” を起動し、次の通りに遷移します。

----

1. アプリとブラウザー コントロール
2. Exploit protection の設定 (かなり下のほうにあります)
3. プログラム設定 タブ
4. C:\WINDOWS\System32\vmcompute.exe &gt; 編集

すると、“制御フローガード (CFG)” の設定がありますので、“☑ システムの上書き” のチェックを外して、適用ボタンを押します。

----

管理者権限が必要な操作のため、UACが出る場合があるので、必要に応じて昇格してからWindowsを再起動します。

それからDocker for Windowsを動かしてみた結果がこちらです！

----

![2019-02-1019-8ca4cdf9-f096-4721-a49a-55fba67f1fa5.15.19.png](https://qiita-image-store.s3.amazonaws.com/0/347102/b7a317d5-c078-b9cf-0d7d-ff2176207029.png)

----

、、よろしい、ならば戦争ですね😌

----

# コマンドで強制的に起動させる

次にググって見つけたのが、[コマンドで強制的にDocker for Windowsを立ち上げている記事](https://ameblo.jp/rupu/entry-12277943121.html)。

----

## コマンド

```PowerShell
PS Admin> cd "C:\Program Files\Docker\Docker\resources"

<# Docker for Windows用Dockerサーバーを破棄 #>
PS Admin> .\MobyLinux.ps1 -destroy

<# Docker for Windows用Dockerサーバーを作成 #>
PS Admin> .\MobyLinux.ps1 -create
```

----

## 結果

> .\MobyLinux.ps1 : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\Docker\Docker\resources\MobyLinux.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」
([https://go.microsoft.com/fwlink/?LinkID=135170](https://go.microsoft.com/fwlink/?LinkID=135170)) を参照してください。

ですよねー💦
PowerShellスクリプトは、デフォでは実行禁止です。

----

そこで、少しコマンドに細工を加えます。

```PowerShell
PS Admin> cd "C:\Program Files\Docker\Docker\resources"

<# Docker for Windows用Dockerサーバーを破棄 #>
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -destroy

<# Docker for Windows用Dockerサーバーを作成 #>
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
```

----

これでPowerShellスクリプトが動きました。
ただこれでも一筋縄ではいきません。

> Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしましたが、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。

一体何なのでしょう。。

----

# VHDXのあるフォルダのアクセス権限を取得する

[記事](https://ameblo.jp/rupu/entry-12277943121.html)では続きがあって、

> C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\

上記フォルダを開くとあります。

----

## エクスプローラーで開いてみる

試しにURLをエクスプローラーに貼ってみましたが、そのままでは開けないようなので、“パブリックのドキュメント”から辿ってみます。

すると怪しげなダイアログが、、

----

![2019-02-1021-1a57ae31-25f6-4cf5-8520-06494308e866.00.50.png](https://qiita-image-store.s3.amazonaws.com/0/347102/38cb2c21-cec6-4921-be1a-c0afc3baf548.png)

アクセス周りでしょうか。権限を取得した状態でもう一度コマンドを実行します。

----

> Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしましたが、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。

だめですか。。😌

----

下記コマンドを実行してから再起動する、という策もググっていたら出てきましたが、こちらも特に効果なしのようです。

```PowerShell
PS Admin> mofcomp %SYSTEMROOT%\System32\WindowsVirtualization.V2.mof
```

----

# `localhost` につながらない？

ここでちょっと思い当たることがありまして、下記コマンドを叩いてみました。

```PowerShell
PS Admin> Hyper-V\Get-VMHost -ComputerName localhost
```

----

Hyper-Vの仮想マシンホスト一覧を取得する関数です。結果は下記の通りでした。

> Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしました
が、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。

やはり先程と同じエラーメッセージです。

----

## PC名の指定を外してみる

```PowerShell
PS Admin> Hyper-V\Get-VMHost
```

```
Name LogicalProcessorCount MemoryCapacity(M) VirtualMachineMigrationEnabled
---- --------------------- ----------------- ------------------------------
DESKTOP-xxxxxxx 4          8110.25390625     False
```

----

正しい値が取れるようになりました！

ということで、この辺をヒントに再度ググってみたところ、Docker for Windowsの[Issueを発見](https://github.com/docker/for-win/issues/1077)。

> I solved it by removing the "-ComputerName" for all commands listed in the file MobyLinux.ps1 in the "function New-MobyLinuxVM { }" and it worked.

ほう。

----

## Docker for WindowsのPowerShellスクリプトを編集する

ということで、不本意ですが、配下フォルダにあるPowerShellスクリプトのうち、`Hyper-V\Get-VMHost -ComputerName localhost` を含むコードを探して、`Hyper-V\Get-VMHost` へ置き換えてみました。

----

## 編集したスクリプトで破棄してみる

```PowerShell
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -destroy
```

> Delete VHD C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\MobyLinuxVM.vhdx

破棄は無事できました！

----

では生成はどうでしょう、、？？

```PowerShell
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
```

> Hyper-V\Get-VMHost : Hyper-V で、コンピューター 'localhost' 上のオブジェクトにアクセスしようとしました
が、オブジェクトが見つからずエラーが発生しました。オブジェクトは削除された可能性があります。仮想マシン管理サービスがコンピューター上で実行されていることを確認してください。

----

🐳さん、、あなたも粘りますね😌

では `Get-VMHost` 関係なしに、`-ComputerName localhost` という記述をすべて削除してみましょうか。

それからまたリトライしてみます。

----

```PowerShell
PS Admin> powershell -NoProfile -ExecutionPolicy Unrestricted .\MobyLinux.ps1 -create
```

> VM created.

、、おおお！？！？

----

![2019-02-1023-6714897d-dfb6-4d90-b7cf-a1498654fb94.47.02.png](https://qiita-image-store.s3.amazonaws.com/0/347102/94251dc2-0173-5269-26bb-766e62c794f7.png)

----

🎉🎉🎉🎉🎉🎉

やりました✨

早速動いているか確認すべく、`docker ps` コマンドを叩いてみましょう。

----

> error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.39/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.

あれれ、、困ったときはひとまずWindowsを再起動してからリトライしてみましょう。。

----

![2019-02-1100-674a80d8-c1e2-45b3-8d70-b82e3512bc5f.06.14.png](https://qiita-image-store.s3.amazonaws.com/0/347102/f84083f4-e112-ccc8-d760-e4a1be728d65.png)

----


無事成功です❗️やったね。

----

## ご視聴ありがとうございました。

それにしても、まさかWindowsでDockerを動かすのがここまで大変とは。。
Mac版くらいに安定して動かせる日が来ることを期待したいです。