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となっています。
# 導入・設定 [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の項目が検証用として追加されています。
Settings - Resourcesにある WSL INTEGRATIONも有効にします。
※ 起動時に再度 WSL INTEGRATION 確認のメッセージボックスが出ます
この設定で Docker Desktopを Restartすると、WSL 2のUbuntuや、Windowsコマンドプロンプトから dockerコマンドを実行できます。
# 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 を実行してみます。
$ 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 を実行すると、
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でプロセスを表示してみます。
$ 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を実行してみます。
$ 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を実行すると、
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のイメージを削除します。
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を実行してみると、
$ 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/
# 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である事が確認できます。
$ 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コマンドが実行できます!
何となくもう動く気しかしませんが一応何か試してみます。
$ kubectl create deployment --image nginx mytest01
deployment.apps/mytest01 created
作れました!
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mytest01-7f5ffbd87d-w2xhv 1/1 Running 0 1m23s
動いているように見えます!
$ kubectl expose deployment mytest01 --port 80 --type=LoadBalancer
service/mytest01 exposed
サービスも定義できました!
そして Windows上のブラウザからlocalhostにアクセスすると。。
ちゃんと動いています!
複数 Podが連携するような簡単な既存アプリケーションの動作も確認できました。
# まとめ
今回の 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上のファイルのコピーがドラッグドロップ出来て大変楽になります。