Windowsで同時にVagrantとDockerを利用できるようになった記録

こんにちは、ジェルファレザです！
今回、ずっと前からの自分の悩みを解決する記事を書きたいと思います。

#きっかけ
今まではWindowsでVagrantかDockerかしか使えませんでした。
ということは、DockerとVagrantを同時に実行することはできません。ですが、もう2021になったのでこのような悩みも要らないでしょう！

開発者として、VagrantとDockerは仲良くしてしてほしいですね。🥰

#条件
始まる前に、私の設定は下記のようになります。

1. Windows 10 Pro x64 ver 1909 build 18363
2. Vagrant ver 2.2.14
3. Virtualbox ver 6.1.18
4. Docker Desktop ver 3.2.2

とりあえず、1~3があれば大丈夫です。No 4は下で設定するので今の段階インストールしなくてもいいです。

>ちなみに、Windows 10 Home Editionも行けるらしい。。（確認要）

#やり方

###Hyper-V
>**20210325更新**：Hyper-Vは本当に必要か、要確認。別のマシンでDockerを立てたらHyper-Vの設定が出てませんので影響を調べていきます。

まず、WindowsのHyper-Vを有効にします。設定の**[Windows の機能の有効化または無効化]**から`Hyper-V`をチェックします。
そのあとWindowsリスタートが必要です。

![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055600/61f19e93-646b-760f-4d12-6bb23589aa48.png)


>Hyper-V有効化後Vagrantをupすると、`VT-x is disabled in the BIOS for all CPU modes`というエラーが出ればBIOS設定が必要です。
[こちら](https://mashtips.com/enable-virtualization-windows-10/)にご参考ください。

###Dockerインストール

最新の[Docker Desktop for Windows](https://www.docker.com/products/docker-desktop)をダウンロードします。
インストールすると、`WSL2コンポネントをインストールする`というオプションも出てるはずです。

![04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055600/d2858fd0-38ed-2890-a15e-a473faf7333d.png)


もしそのオプションが出てない場合、こちらのステップを従ってください。

![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1055600/579aa635-3de2-5636-5c9e-c9f3c1c08942.png)


- もう一度Windows情報を確認します。WSL2を使うため、[Windows build 18362](https://docs.microsoft.com/en-us/windows/wsl/install-win10)以降しか使えなさそうです。
- そのbuild versionでも`WSL2コンポネントをインストールする`が出てないなら多分私と同じ状態です。私のWindows build versionは合ってますが、なんでWSL2は設定できないのか。謎です。
深掘りするとbuild versionだけではなく、特定の[Windows update](https://www.omgubuntu.co.uk/how-to-install-wsl2-on-windows-10)も必要とのことです。
[Windows update kb4566116](https://support.microsoft.com/en-us/topic/august-20-2020-kb4566116-os-builds-18362-1049-and-18363-1049-preview-c75c6a43-9c87-e412-9a9e-10a0dabac4d5)

> 会社のポリシーによるこのupdateは除外されてる可能性があるため、自己インストールです。

Dockerインストール後、またWindowsリスタートが必要です。そのあと、Dockerが使えるはずです！

```bash

j-daviano@HOMER C:\Users\j-daviano
$ docker --version
Docker version 20.10.5, build 55c4c88
```

よさそうです！

###Vagrant調整

ここまでは、Vagrantがなかったら終わりですが、この記事はVagrantとDockerを仲良くさせるミッションでしょう。
では、Vagrantを起動しましょう。

```bash
j-daviano@HOMER C:\Users\j-daviano\Documents\vagrantDocker
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'gbailey/amzn2' version '20210127.0.0' is up to date...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 3000 (guest) => 3000 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection reset. Retrying...
    default: Warning: Connection aborted. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Exporting NFS shared folders...
==> default: Preparing to edit nfs mounting file.
[NFS] Status: halted
[NFS] Start: started
==> default: Mounting NFS shared folders...
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/j-daviano/Documents/vagrantDocker
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

```

**行けました！**🎊🎊

もしVagrant bootのときにタイムアウトが発生しまったら、Hyper-VのParavirtualization Interfaceが必要かもしれませんのでVagrantFileに下の設定を追加して`vagrant reload`してください。

```

Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
```

```bash
config.vm.provider "virtualbox" do |vb|
  vb.customize [
    "modifyvm", :id,
     "--paravirtprovider", "hyperv"
  ]
end
```

#あとがき
やっと、VagrantとDockerは一緒に遊んでます。
これでスムーズな開発ができるはず。皆さんもぜひ、試してくださいね！

私は、今後React+Go+DBをDocker化にしたいです！また次の記事！

#参考資料
- https://kubut.medium.com/it-is-2021-running-docker-and-vagrant-parallel-on-windows-isnt-impossible-anymore-a8ea7de0536c
- https://andrewlock.net/installing-docker-desktop-for-windows/