Docker Desktop WSL 2 Backend を入れてみました ( Docker Desktop 2.2 も本記事の検証部分の結果は大体同じです )

# Docker Desktop WSL 2 Backend
2019/10/24付 Docker Engineeringに投稿された以下リンクに、Docker Desktop WSL 2 Backendの内容が掲載されており、Docker Desktop for WSL 2（Technical Preview）から大きく変更されている模様なので動作検証を行いました。
・Introducing the Docker Desktop WSL 2 Backend
https://engineering.docker.com/2019/10/new-docker-desktop-wsl2-backend/

Technical Previewからの変更点や仕組み等はリンク内容に記述されていますが、その中でも興味深いのは **WSL 2での Kubernetesサポート**です。

Docker Desktop WSL 2 backendの最新バージョンは上記リンク内容後方にある The future of Docker Desktop中のリンクから取得できますが、本稿作成時点では Docker Documentationに通常のマニュアルとして Docker Desktop WSL 2 backendの項目があり、前提条件、導入方法、モジュールのダウンロード先等が記載されています。

・Docker Desktop WSL 2 backend
https://docs.docker.com/docker-for-windows/wsl-tech-preview/

今回検証したバージョンは、
Windows 10が「Windows 10 insider preview 19041.1 (vb_release)」で、winverコマンドでは「バージョン 2004 （OSビルド 19041.1）」となっており、
Docker Desktop WSL 2 Backend のバージョンは 2.1.7.0(41536) edgeとなっています。
<hr>
# 導入・設定
[Docker Documentation][link1] の手順で導入し Docker Desktopを起動した後の設定などは、従来と同様に Windowsタスクバーの Dockerアイコンで行います。
前提となる WSL 2 の Ubuntuに Dockerクライアントや Kubernetesは導入していません。
[link1]:https://docs.docker.com/docker-for-windows/wsl-tech-preview/
![DockerDesktopMenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/64282c3b-e253-fa4c-c724-190d9ada5930.png)


Technical Preview版で追加されていた WSL 2 Tech Previewメニューは無くなっており、Settings - General に WSL 2 based engineの項目が検証用として追加されています。
![general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/a0dea149-b5cf-e032-5019-0e0fd564eba7.png)

Settings - Resourcesにある WSL INTEGRATIONも有効にします。
![WSLIntegration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/a611fdc8-1782-888c-7484-546c5ab9e94d.png)
※ 起動時に再度 WSL INTEGRATION 確認のメッセージボックスが出ます

この設定で Docker Desktopを Restartすると、WSL 2のUbuntuや、Windowsコマンドプロンプトから dockerコマンドを実行できます。
<hr>
# hello-world コンテナによる確認
さて、以前の Technical Preview版の検証では Docker DesktopVM上での Dockerデーモンと、WSL 2上の Dockerデーモンが別々に動作しており、docker contextコマンドで Docker Endpoint を切り替えて使用できる事が分かっていました。

・参考：Docker Desktop for WSL 2 を入れてみました
https://qiita.com/SHIRANO/items/42616bb76630df068f33

今回検証する backend版ではどうでしょうか。WSL 2 の Ubuntuで docker context ls を実行してみます。

```Console
$ docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
```
Technical Preview版と同じような表示です。

続いて Windows のコマンドプロンプトでも docker context ls を実行すると、

```Console
C:￥Users￥myuser>docker context ls
NAME                DESCRIPTION                               DOCKER ENDPOINT                  KUBERNETES ENDPOINT                                 ORCHESTRATOR
default *           Current DOCKER_HOST based configuration   npipe:////./pipe/docker_engine   https://kubernetes.docker.internal:6443 (default)   swarm
wsl                 Docker daemon hosted in WSL 2             npipe:////./pipe/docker_wsl
```
Technical Preview版での contextは wslをポイントしていましたが、backend版では変更されています。

もう少し調べるために WSL 2の Ubuntuでプロセスを表示してみます。

```Console
$ ps -ef | grep docker
root        41    40  0 13:04 pts/0    00:00:00 /mnt/wsl/docker-desktop/docker-desktop-proxy --distro-name Ubuntu --docker-desktop-root /mnt/wsl/docker-desktop
```
Technical Preview版では WSL 2の Ubuntuで dockerデーモンが動作していましたが、backend版では docker-desktop-proxyという Docker機能のプロキシーのようなプロセスが確認できます。
また Windows Hyper-Vマネージャーの表示では、Docker DesktopVMは動作していない状態ですが、WSL 2の Ubuntuと Windowsコマンドプロンプトからの両方から Docker機能を利用できそうです。
（起動直後に docker infoとか試してみました・・）

動作の確認のためにまず WSL 2の Ubuntuで hello-worldを実行してみます。

```Console
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
以下省略・・・
```
コンテナイメージが pullされてから実行されました。

続いて Windowsコマンドプロンプトからも hello-worldを実行すると、

```Console
C:￥Users￥myuser>docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
以下省略・・・
```
pullされずに実行されました。

更にWindowsコマンドプロンプトで hello-worldのイメージを削除します。

```Console
C:￥Users￥myuser>docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
```
再度 WSL 2の Ubuntuで hello-worldを実行してみると、

```Console
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Already exists
Digest: sha256:d1668a9a1f5b42ed3f46b70b9cb7c88fd8bdc8a2d73509bb0041cf436018fbf5
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
以下省略・・・
```
またもやコンテナイメージが pullされました。

**この事から backend版を WSL 2 based engine、および WSL INTEGRATIONを有効にして起動した場合は、Dockerエンジンが動作する空間が Hyper-Vマネージャーからは制御できない状態で起動しており、WSL 2の Ubuntuと Windowsコマンドプロンプトの双方が同じ Dockerコンポーネントを利用する仕組みになっている事が確認できました。**
backend版の仕組みは以下で解説されています。
https://engineering.docker.com/2019/10/new-docker-desktop-wsl2-backend/
<HR>
# Kubernetes の動作確認
さてさて、漸くここから Kubernetesの検証です。
![kube.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/32b22d06-c039-2b6b-54f2-c8df7d18e9dc.png)

Settings - Kubernetes から Kubernetesを有効にして Restartします。

WSL 2の Ubuntuから確認すると、Kubernetes関連のコンテナが動作しており、masterノードが Readyである事が確認できます。

```Console
$ docker ps
CONTAINER ID        IMAGE                            COMMAND …
cc08124518de        fab2dded59dd                     "kube-scheduler --bi…"
e85c88818dbc        1399a72fa1a9                     "kube-controller-man…"
b7d619430080        docker/kube-compose-controller   "/compose-controller…"
ef26057e69b3        docker/kube-compose-api-server   "/api-server --kubec…"
98a0ac80e3b3        k8s.gcr.io/pause:3.1             "/pause"
bf51c8ab6e83        k8s.gcr.io/pause:3.1             "/pause"
93e5a646f6ac        eb516548c180                     "/coredns -conf /etc…"
eac22469725e        eb516548c180                     "/coredns -conf /etc…"
7244ff2ca2ee        cbd7f21fec99                     "/usr/local/bin/kube…"
1318c1f189c2        k8s.gcr.io/pause:3.1             "/pause"
468b6b5acf33        k8s.gcr.io/pause:3.1             "/pause"
a2b9fe44131c        k8s.gcr.io/pause:3.1             "/pause"
77cb5b85c2cc        2c4adeb21b4f                     "etcd --advertise-cl…"
5e7cb9113f6e        e534b1952a0d                     "kube-apiserver --ad…"
a8d879b03ade        k8s.gcr.io/pause:3.1             "/pause"
a59fb76a04b0        k8s.gcr.io/pause:3.1             "/pause"
ac089105911e        k8s.gcr.io/pause:3.1             "/pause"
52ff10b46a84        k8s.gcr.io/pause:3.1             "/pause"

$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   1m   v1.15.5
```
**ｵｵｵ- (ﾉﾟοﾟ)ﾉ ｵﾄﾞﾛｷ。。。kubectlコマンドが実行できます！**

何となくもう動く気しかしませんが一応何か試してみます。

```Console
$ kubectl create deployment --image nginx mytest01
deployment.apps/mytest01 created
```
作れました！

```Console
$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
mytest01-7f5ffbd87d-w2xhv   1/1     Running   0          1m23s
```
動いているように見えます！

```Console
$ kubectl expose deployment mytest01 --port 80 --type=LoadBalancer
service/mytest01 exposed
```
サービスも定義できました！

そして Windows上のブラウザからlocalhostにアクセスすると。。
![nginx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/1bea1a1e-b837-5185-0b77-1e7d534afaf2.png)
ちゃんと動いています！:clap_tone1::clap_tone1::clap_tone1:

複数 Podが連携するような簡単な既存アプリケーションの動作も確認できました。
<HR>
# まとめ

今回の Docker Desktop backend版の検証では、数か月前に公開された Technical Preview版から大幅に改良されている事が確認できました。特に開発者の目線からは **WSL 2で Kubernetesが容易に利用できる事が（Windowsのローカル環境で開発、単体テストを完結できる事が）**非常に有意義な事であると思います。(Mac版ではかなり前から出来ていた事が漸くWindows版でも出来るようになっただけと言う方がいましたが、、やっぱりWindows環境でというところに個人的には大変意味があると思っています・・)
2020年の春に予定されている Windows 10のメジャーバージョンアップで WSL 2が正式リリースされる事により、今回検証した backend版との組み合わせで恩恵を受ける開発者の方が多くなるのではないでしょうか。
ちなみに WSL 2 based engineを使用しない場合は、従来と同様に Hyper-Vで Docker DesktopVMが動作しており、起動時間、動作は体感で数段遅いように感じました。そもそももう Windowsのコマンドプロンプトを利用する意味が無くなるように思われるので（Linux系のコマンドはWSL 2で実行すれば良いと思うので）、個人的には従来の Hyper-V Docker DesktopVM方式は不要であると感じています。

# おまけ
Windowsのショートカットを作成しておく事でファイルエクスプローラーでの操作が容易になります。￥￥wsl$￥Ubuntu のように設定します。**Windows上のファイルと Ubuntu上のファイルのコピーがドラッグドロップ出来て大変楽になります。**
![shortcut.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475210/9b6f6679-2d2d-a2b0-b49d-07de63ab7acb.png)