[Windows WSL2] WSL2でDocker開発環境を構築してみる

Construct Docker development env on Windows10 WSL2

先日あったmicrosoft dev insiderでも周知がありましたが、 WSL2(Windows Subsystem for Linux)がもう利用可能ということで早速 WSLからWSL2へ切り替えてみましたよ。

WSL2ではもろもろ挙動が改善されている他に、何と言ってもDockerが利用できるようになるのが おいしいところ。

ソフトウェアの充実っぷりはどうしてもMacよりWinに軍配があると思ってるし開発も WindowsローカルでMac(Linux環境)と謙遜なく使えるようなら今後私のMacはお蔵入りかも。

ということで今後の開発環境どうするかの検討含め確認してみるのです。

はじめに

さて、私がプログラミングを大学から少しずつ始めて早10年くらい?

開発環境はおおよそ以下の感じで変遷してきた気がします。

desc
大学時代初め WindowsPC localにあれこれコンパイラインストール開発
大学時代中盤 VPS(Centos)を契約してWebサイトを立ち上げる。開発もVPS上で行う
大学時代終盤 WindowsPCにFedoraをdualbootさせてそこで開発
社会人初め頃 WindowsPCにVM(VirtualBox)でCentos入れて開発
社会人中盤 資金ぶりがようやく落ち着きMacを買う。Mac localで開発
Now Macで開発用Containerイメージpull、そこで開発. IDEが使いたいときはVSCode RemoteでMacからContainer or VPSへ接続して開発
Now(お仕事中) 様々な制約のためWindows localで開発、たまにVMベタ

時と場合によって異なりますが、

  • local汚したくないからVPS(レンタルサーバ)へ
  • VPSも汚したくないしRemoteはもっさりするからやっぱlocal
  • local汚したくないし開発環境によって挙動(再現性)が変わるからContainer内で

て感じに変遷、privateでの開発はcontainerで行うようになってきています。 あと最近だとAWSのCloud9(クラウド環境)でコードをいじる機会も少しずつ増えてきてます。 (お仕事での開発は割り切ってlocal, VMベタで汚しまくってるけど..)

ということで基本開発はMacを利用している状態なのですが、普段使いのPCとしてはソフトウェアの対応関係からどうしてもWindows環境は欠かせないわけです。

もしWindows localでLinux環境使えてそこでContainerも動くとなるとWindowsマシンのみで開発から普段使いまで事足りるね、ということでWSL2を試してみます。

WSL2に切り替える

環境

切り替えを行う前に、今回でのPCの環境をもろもろ洗っておきます。

  • Windows環境
    • Windows10 Home edition
    • バージョン1903 (OS build 18932.1000)
    • 既存Docker構成 : DockerToolbox (VirtualBox)利用
    • 既存k8s構成 : minikube利用
  • 既存WSL環境
    • Ubuntu 18.04.2 LTS

切り替えはめちゃめちゃ簡単。以下公式ドキュメントに従うだけでいけました。

https://docs.microsoft.com/en-us/windows/wsl/wsl2-install

事前準備だけちょっと注意。

ビルドバージョンがWindows 10 build 18917以上である必要がある

この記事執筆時点ではまだデフォルトでアップデートが降ってこないのでWindows Insider Programで設定をファスト以上にする必要がありました。

wsl2_settings1

wslコマンドをつかっていじる

基本的にWSLに関する設定はPowershell上でwslコマンドを用いて行います。

# 管理者モードで以下実行してVM機能を有効にする(実行後再起動)
> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

# 再起動後、powershellを再度起動しwsl2に切り替える(以降は管理者モードでなくてよい)
## 切り替える対象のディストリビューションを確認
> wsl -l
Windows Subsystem for Linux ディストリビューション:
Ubuntu (既定)

## Ubuntuを切り替える (2を1にすればすぐ切り戻しも可能)
> wsl --set-version Ubuntu 2

## defaultでwsl2にしたい場合は以下指定
> wsl --set-default-version 2

## 切り替わったか確認
> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

## そのままwsl2の環境にログイン
> wsl
Agent pid 1705
kon@nicopun:/mnt/c/Users/test$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
...

WSL1と比較して、起動が早くなってもっさり感もなくなっているのが体感でもわかりました。 すげー。。

Dockerを試す

docker自体のインストール方法は公式通りで問題ないです。

https://docs.docker.com/install/linux/docker-ce/ubuntu/

起動時だけちょっとあれってなった

# systemctlだと起動できない。。。
$ sudo systemctl status docker
System has not been booted with systemd as init system (PID 1). Can't operate.

# serviceで起動するとうまくいった
$ sudo service docker start
* Starting Docker: docker       [ OK ]

$ sudo service docker status
* Docker is running

# 適当にコンテナ実行
$ sudo docker run --rm hello-world
[sudo] password for test:
Hello from Docker!
...

問題なし!

WSL1とのメリデメ

WSL2はWSL1と比較していいこと尽くめ、というわけでもなさそうです。詳細は以下を参照。

https://docs.microsoft.com/en-us/windows/wsl/wsl2-ux-changes

ざっくりまとめると

  • Linux root filesystem内でのファイルアクセスは高速化, だけどWinとのファイルアクセスは低速化
  • WinからWSL2へのネットワークアクセスはlocalhostでなくIP指定しろ(WSL2からWinも同様) 1
  • ストレージはext4 file systemのVHDを採用。256GBを超える場合は拡張する必要あり

特にlocalhostでアクセスできないのはちょっと使い勝手が微妙。一応以下のような記述がみられるので今後修正されるらしいけども。1

This is something that is temporary, and very high on our priority list to fix.

あとはWindowsのExplorerからLinuxにアクセスできるようになったのはすごいところ。

# linux環境からexplorer起動
$ explorer.exe .

wsl2_explorer

痛いのはWindows上でVM(VirtualBox)が使えなくなってしまうところ。

特にWindows10 Home editionだとHyper-V非対応だからDockerToolboxを使うことになると思うけど DockerToolboxはVirtualBoxに依存してるからWindows自体でDockerが起動できなくなってしまうという事態に。。

試しにDockerを起動してみるとやっぱりエラーになるですね。

$ docker-machine.exe start
Starting "default"...
(default) Check network to re-create if needed...
(default) Windows might ask for the permission to create a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Found a new host-only adapter: "VirtualBox Host-Only Ethernet Adapter #7"
(default) Windows might ask for the permission to configure a network adapter. Sometimes, such confirmation window is minimized in the taskbar.
(default) Windows might ask for the permission to configure a dhcp server. Sometimes, such confirmation window is minimized in the taskbar.
Unable to start the VM: C:\Program Files\Oracle\VirtualBox\VBoxManage.exe startvm default --type headless failed:
VBoxManage.exe: error: Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

Details: 00:00:03.250427 Power up failed (vrc=VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT, rc=E_FAIL (0X80004005))

と悲観しかけたが、Docker DesktopがまもなくWSL2対応するらしい。

https://engineering.docker.com/2019/06/docker-hearts-wsl-2/

これでこれまでHyper-V対応のWindows10 Proでないと利用できなかったDocker DesktopWindows10 Homeでも起動できるようです。 よかた、もう少し待ってみよう。

(Proの恩恵が目減りするような気もするけど。)

==========2019/08/01追記============

その後、7/31にWSL2対応のDocker Desktopがリリースされました。 詳細は以下を参照のこと。

がしかし早速試してみたところ、以下のエラー。。。

Docker Desktop requires Windows 10 Pro or Enterprise version 15063 to run.

issueにも同様の報告が上がっています。これは残念ながらもうちょい待ちですね。2

https://github.com/docker/for-win/issues/4378

おわりに

今回WSL2への移行を行い、問題なくlinux上でのContainer環境が手に入りました。 また、それ以上にWSL1の時にあったもっさり感がなくなり、普通にLinux Local環境を触っている感覚なのはすごい。

もう少し使ってみて問題なさそうならMacから開発環境を乗り換えようと思います。

また、最近ではAWSのCloud9もかなり使いやすく、VisualStudioもブラウザ版リリース予定とのことで、 オンラインならPCのスペック依存から解放されるので今後開発環境はクラウドもガンガン使っていく気がします。

結局開発環境は今後もあれこれ変遷していきそう。。


  1. Windows 10 Insider Preview Build 18945より早速修正されました!詳細は公式ブログを参照。 ↩︎

  2. 2020-03-02、Docker Desktop Community 2.2.2.0にて 正式にWindows10 HomeでのDocker Desktopサポートがリリースされました 🎉 ↩︎


See also