WSL2でDockerを動かす

f:id:translucens:20200609011257p:plain

Windows 10 May 2020 Updateが正式に公開され、Windows Subsystem for Linux (WSL) が2になってDockerとの互換性が向上したとのことだったで試しました。

TL; DR

WSL1での辛み(DockerがUbuntu16.04では動くが18.04では動かなくなってしまう、ファイルアクセスはWindows側のNTFSへ読み替える都合でパフォーマンスが出ない等)は解消され、Linuxでの実用的な開発環境として使えるようになりました。

Windows 10 May 2020 Updateへの更新

Windows Upteteの画面にWindows 10 May 2020 Updateが出ない場合Update Assistantで強制的に更新することができます。なんらかの互換性の問題で自動で更新されないようになっている可能性はありますが、手持ちの環境 (Surface Pro 4) では特に問題なく更新できました。

WSL2版Ubuntu 20.04のインストール

Canonicalのサイトの指示の通りにWSLを有効にした後、Microsoft StoreからUbuntu20.04をインストールします。

ubuntu.com

WSL2版Dockerのインストール

次にDockerを入れるのですが、WSL2でUbuntuが動いているからと言ってUbuntuへのDockerのインストール手順を使っても動作しませんでした。

Docker Desktop on Windowsによりインストールする必要があります。インストーラの画面でデフォルトでWSLを使うチェックボックスが入っているので、そのまま進めるとインストールは完了します。

docs.docker.com

ここでUbuntuと並んでDocker用のVMが生成されていることを確認します。

PS > wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-20.04           Running         2
  docker-desktop         Stopped         2
  docker-desktop-data    Stopped         2

Dockerが自動的に kubectl もインストールしますが、古いベータ版のようなのでKubernetes公式のインストール手順に沿って正式版にしておく方がよいでしょう。

 $  kubectl version
Client Version: version.Info{Major:"1", Minor:"16+", GitVersion:"v1.16.6-beta.0", GitCommit:"e7f962ba86f4ce7033828210ca3556393c377bcc", GitTreeState:"clean", BuildDate:"2020-01-15T08:26:26Z", GoVersion:"go1.13.5", Compiler:"gc", Platform:"linux/amd64"}

Windows環境からのネットワーク疎通確認

docker run --rm -p 8080:80 nginx:1.18 としてWindows側のブラウザで http://localhost:8080/ を開き、Welcome to nginx!のデフォルトのページが表示されればよいです。

その他Windows/WSL間でのネットワーク・ファイルのやりとりについて

  • WindowsLinuxのネットワークアクセス
    • 上記のnginxのように localhost 宛にアクセスする
  • LinuxWindowsのネットワークアクセス
    • Linux側でネームサーバを調べ、そのアドレス宛にアクセスする

ネットワーク関連はMicsoroftの公式ドキュメント Linux 用 Windows サブシステムの概要 | Microsoft Docs に詳しく説明されています。

  • WindowsからLinuxファイルシステムを参照する
    • \\wsl$\Ubuntu-20.04 のようなパスにマウントされる。 \\wsl$ をクイックアクセスに入れておくと便利。
  • LinuxからWindowsのファイルを参照する
    • /mnt/c/Windows のように /mnt/DRIVE_LETTER にマウントされる

kindを使ってKubernetes環境をローカルに立てる

Docker内部で動くKubernetesであるkindの動作確認をします。 Readmeに沿って kind CLIをインストールして kind create cluster とすればクラスタが立ち上がります。

github.com

下記のようなKubernetesマニフェストkubectl apply -f kindtest.yaml のように適用して、 kubectl port-forward svc/apache 8888:8888 としてポートフォワードを有効にし、ブラウザで http://localhost:8888 を開いて It works! のページが出れば動作確認完了です。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache
spec:
  selector:
    matchLabels:
      app: apache
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - name: apache
        image: httpd:2.4.43
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: apache
spec:
  type: ClusterIP
  selector:
    app: apache
  ports:
  - port: 8888
    targetPort: 80

RAMを消費するので用が済んだら kind delete clusterクラスタを片付けておきます。