【﻿環境構築】Dockerで起動エラー！Hyper-Vを有効にして再びDockerを起動するための手順

# Docker起動でエラー発生
仮想環境の構築にはDockerを使いたい派なのですが、どうしてもVMwareを使わなければいけない事情があり、しばらくVMwareを使用していました。開発も落ち着いてきたので、そろそろDockerを使おうかなと起動しようとしたところ、エラー画面共に頬を赤く染めたDockerクジラの絵が表示されました。VMwareを使う際にHyper-Vを無効にしたので、その影響だと思います。

<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/4e5a6457-fa07-0107-cf45-28e1c336b3ff.png">
今回は上記のエラーが出たときに必要な手順をまとめました！

# 環境
| 環境       |バージョン    |
|:-----------------|------------------|
|  Windows10|        1909        |
| Docker(Community Edition     |      18.06.1|
| VMware Workstation 15     |      -|

# 解決策
`bcdedit`を実行して確認できる`hypervisorlaunchtype`の値が「Off」だったら、
管理者権限で起動したPowerShellで `$ bcdedit /set hypervisorlaunchtype auto` を実行後、PCを再起動する！

# やったこと
1. Docker起動でエラー発生
2. Hyper-Vと仮想化の有効、無効を確認
3. bcdeditで状態を確認
4. 再起動&Docker起動

# 詳細
#### 1. Docker起動でエラー発生
<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/4e5a6457-fa07-0107-cf45-28e1c336b3ff.png">
Dockerを起動したところエラーが表示されました。
リンク先を確認してみると、Virtualizationの欄にBIOSという文字を発見。**あ**とのことなので、現在のPC状態を確認します。

#### 2. Hyper-Vと仮想化の有効、無効を確認
<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/22b9cf76-7eca-0915-0e79-33b26226d932.png">
※右ウィンドウが自分の設定
Hyper-Vは有効になっている。

<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/e1dd933e-1f0b-1271-3ac6-7ad10c79fccb.png">
※右ウィンドウが自分の設定
仮想化も有効になっていました。

#### 3. bcdeditで状態を確認
PCの再起動やコマンドによる設定の確認も試しましたが、状況は変わらず。

改めて調べてみると、Hyper-Vが有効になっているのにエラーが起きている現象が多々あることを発見しました。そこで、下記の記事と照らし合わせてみると、`bcdedit` コマンドで確認できる、`hypervisorlaunchtype` の値を確認する必要があることが分かりました。
>【Docker】 Docker for Windows導入時のエラー対応
https://qiita.com/LemonmanNo39/items/b1b104e7fb609464727b

<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/801559ec-b272-1cb9-a1b0-f6df9064060a.png">
実際に確認してみると、`hypervisorlaunchtype    Off ` となっていたので、管理者権限で起動したPowershellで下記コマンドを実行。

```
# hypervisorlaunchtypeを切り替える
bcdedit /set hypervisorlaunchtype auto
```

#### 4. 再起動&Docker起動
<img width="400" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/d75742db-061c-54ea-8ee7-26ca6bad0ee0.png">
PCの再起動後にDockerを起動したところ、無事に起動。コンテナも問題なく起動できました。

# 補足
#### ■bcdeditとかhypervisorlaunchtypeって何？

**bcdedit**：PC起動時の情報(BCD)を確認するためのコマンド
**hypervisorlaunchtype**：Hyper-Vの有効／無効の設定値

先程Powershellで実行したのは、bcdeditコマンドで設定値を確認して、Hyper-Vを有効に設定した、ということですね。

>参考：
■Windowsのbcdeditでブートメニューの表示順序やデフォルトを変更する
　https://www.atmarkit.co.jp/ait/articles/0905/08/news096.html
■bcdeditでブート構成情報をバックアップ／リストアする
　https://www.atmarkit.co.jp/fwin2k/win2ktips/1157bcdedit2/bcdedit2.html
■他の仮想環境を利用するためにHyper-Vを一時的に無効にする
　https://www.atmarkit.co.jp/ait/articles/1511/13/news032.html

#### ■さっきHyper-Vを有効にしなかったっけ...？
`Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All` のコマンドと
`bcdedit /set hypervisorlaunchtype auto` のコマンドって何が違うのか？
これについては、前者はHyper-Vの有効/無効の設定で、後者はHyper-Vの起動設定ではないか
そのため、hypervisorlaunchtype auto が autoになっていても
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-Vの設定がOFFなら
dockerは使えないのではないかと考えました。 

##### 検証
###### 1.まずHyper-Vを無効化&再起動
 `Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All`

###### 2.再起動後、値を確認。

（画像）
Hyper-Vはチェックが外れている。

###### 3.bcdeditコマンドを確認
→hypervisorlaunchtypeの値がなかった。

###### 4.この状態でdockerを起動するとエラーが表示された

hypervisorlaunchtypeの値はHyper-Vが有効になっていないと表示されないようです。

>■トラブルから理解するHyper vの基礎　P8
>　https://www.slideshare.net/NaokiAbe/hyper-v-25767921

###### 5.Hyper-Vを有効にしたのち、再起動。bcdeditの値を確認。
`hypervisorlaunchtype    Auto` になっていた。

###### 6.dockerを起動。
<img width="400" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/d75742db-061c-54ea-8ee7-26ca6bad0ee0.png">
無事に起動。

以上のことから、Dockerを使うときは**WindowsのHyper-Vの設定ON→hypervisorlaunchtypeがAutoとなっている**必要がありそうです。

またDockerが使えるようになったので、また開発していきたいと思います！
それでは！

## 参考
>■Logs and troubleshooting
　https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization-must-be-enabled
■Windows 10 の役割を PowerShell で有効/無効にする
　http://www.vwnet.jp/windows/w10/WindowsOptionalFeature.htm
■【Docker Desktop】エラーで起動できない場合の対策
　https://algorithm.joho.info/programming/docker-for-windows-hardware-assisted-virtualization-and-data-execution-protection-must-be-enabled-in-the-bios/
■Windows 10で仮想化プラットフォーム「Hyper-V」を有効にする
　https://www.atmarkit.co.jp/ait/articles/1806/25/news026.html