WSLでDocker for windowsを使うッ！！！

## 初めに

この記事はッ！！
bashが使いたい系男子がッ！！
WSLでDocker for Windowsを設定する記事であるッ！！（ﾊﾞﾊﾞﾝ

ずっとこのノリだと疲れるので、
以降は、普通に行きますね。

## 前提

- Docker for Windowsがインストール済みである。
- Windows Subsystem for Linux(WSL)が使える状態である。

## 環境

**WSL(Ubuntu 18.04 LTS)**

|ツール名|バージョン|
|:--:|:--:|
|docker| 18.09.7
|docker-compose|1.24.0

**Windows 10 (version 1809)**

|ツール名|バージョン|
|:--:|:--:|
|docker desktop community| 2.0.0.3
|docker machine|0.16.1
|docker engine|18.09.2


## 使う目的

なんで、わざわざWSLを使うのか。WindowsでBash使いたいじゃん？？
後、ネットだとUnix系の情報が多いので。そっちの方が楽かなと。

## WSLからDocker for Windowsのデーモンを呼び出す。

WSL環境だけで、Dockerを動かす手法は存在するのですが、
まだ、最新のDockerが動かなかったり、WSLを落とすと死ぬとか
ひと手間必要な印象がありますので、WSLのDocker ClientからDockerを呼び出します。

1. 通知領域から、dockerのアイコンを右クリックして、Settingを選択
2. Generalのexpose deamon on~~のチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83578/2352a823-6e55-77e8-8147-f1438bc2e3f5.png)
これで、Docker for WindowsのDocker DeamonがTCP経由でアクセスできるようになりました。(without TLSって書いてあるから、TLS利用でできるのかも)

```powershell
Convertfrom-Json (Invoke-WebRequest http://localhost:2375/version).content

Platform      : @{Name=Docker Engine - Community}
Components    : {@{Name=Engine; Version=18.09.2; Details=}}
Version       : 18.09.2
ApiVersion    : 1.39
MinAPIVersion : 1.12
GitCommit     : 6247962
GoVersion     : go1.10.6
Os            : linux
Arch          : amd64
KernelVersion : 4.9.125-linuxkit
BuildTime     : 2019-02-10T04:13:06.000000000+00:00
```
3. WSLの.bashrcと.bash_profileに、以下を追加します。

``` bash:.bashrc
echo "export DOCKER_HOST=tcp://localhost:2375" >> ~/.bashrc && source ~/.bashrc
```

```bash:.bash_profile
if [[ -f ~/.bashrc ]] ; then
    . ~/.bashrc
fi
```

これで、WSL上からDocker for Windowsを使うことができます。

## Docker for windowsで、Cドライブをマウントする。

1. 通知領域から、dockerのアイコンを右クリックして、Settingを選択
2. Shared DrivesでCのチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83578/94adf7e8-9c57-8288-3ec0-6ee0d762cdd6.png)
3. Windowsのユーザー名とパスワードの入力を求められるので、入力します。
4. セキュリティソフトのファイアウォールにブロックされるので、通信を許可してもらいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83578/e8e41773-8bc3-4f15-5603-cd517e9d8acc.png)  
具体的な手順は、「docker for windows shared drives ファイアウォール」で、ググるといくつか出てきたので、リンクを張り付けておきます。

- [Windows10 で、Dockerで環境作る際の　ESETのファイアーウォール設定](https://qiita.com/Naritoshi/items/09b3abf706caff237303)
- [Docker for WindowsのShared Drives設定（Kaspersky Firewall設定）] (https://qiita.com/spiderx_jp/items/fa8d5ffe298759df9e06)
- [DockerのShared Driveがノートンのファイアウォールに引っかからないようにする](https://gfonius.net/blog/docker-norton/)


## WSLのマウント先を変更する

Windowsで直接使うのなら、上記の設定まで行えば完了です。
しかし、WSLで使うなら、Windowsのディレクトリがマウントされない問題があるので、ひと手間必要です。（実際は、絶対パスでWindows風のパスを書けば、マウントできる）

### Windowsのディレクトリがマウントされない問題

以下のように、DockerのVolume設定が相対パスで指定されていると、
WSLのDockerクライアントまたはDocker-Composeで、コンテナを起動させると
`/mnt/c`以下がマウントされない問題があります。

これは、Docker for Windowsが動いているHyper-V上のLinuxとWSLのWindowsのドライブのマウント先が異なることによって起きる問題です。
（Hyper-VのLinuxでは、Cドライブが、/cにマウント
WSLだと、Cドライブが/mnt/cにマウントされる。）

WSLのDocker-Composeはこのマウント先の相違を吸収せずに、そのままDockerに渡してしまうので、空のディレクトリがマウントされてしまうのです。
(Hyper-V上では、/mnt/cにCドライブがマウントされていないため空になる)

そのため、Windowsディレクトリのマウント位置を一致させれば、問題は解決します。
具体的には、下記のように編集します。
標準のマウントポイントを`/`に変更

```bash:/etc/wsl.conf
[automount]
root = "/"  
```


## 反映しないときは 
**2019/12/06 追記**
以下のコマンドを管理者権限で実行して、WSLを再起動する。

```powershell
net stop LxssManager
net start LxssManager
```


## 参考資料

- [Docker for Windowsで快適な環境を得るまでの そこそこ長い闘い - Qiita](https://qiita.com/YukiMiyatake/items/73c7d6c4f2c9739ebe60#%E8%A7%A3%E6%B1%BA%E6%A1%881-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0)
- [docker for windowsをWSLから呼び出す - Qiita](https://qiita.com/neight0903/items/695f8547b41d2ba9e9c0#docker-for-windows%E3%81%AEdaemon%E3%81%B8%E6%8E%A5%E7%B6%9A)
- [Bash on Windows 起動時に ~/.bashrc が読み込まれない - 今日も窓辺でプログラム](https://www.madopro.net/entry/bash_on_windows_bashrc)
- [Docker for WindowsとDocker on WSLにおけるボリュームマウント](https://tamosblog.wordpress.com/2019/03/11/volume_mount_by_docker_on_wsl/)
- [Docker Desktop(for Windows) + WSLのdocker-composeでvolumes指定が引っかかった - white pages](http://overslept-dev.hatenablog.com/entry/2019/03/11/013929)
- [WSL を再起動するには](https://vogel.at.webry.info/201907/article_4.html)