WSL2でDockerを動かす
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をインストールします。
WSL2版Dockerのインストール
次にDockerを入れるのですが、WSL2でUbuntuが動いているからと言ってUbuntuへのDockerのインストール手順を使っても動作しませんでした。
Docker Desktop on Windowsによりインストールする必要があります。インストーラの画面でデフォルトでWSLを使うチェックボックスが入っているので、そのまま進めるとインストールは完了します。
ここで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間でのネットワーク・ファイルのやりとりについて
- Windows→Linuxのネットワークアクセス
- 上記のnginxのように
localhost
宛にアクセスする
- 上記のnginxのように
- Linux→Windowsのネットワークアクセス
- 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
とすればクラスタが立ち上がります。
下記のような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
でクラスタを片付けておきます。