Windows Subsystem for Linux 2に対応したDocker Desktopが目指すもの

「Windows Subsystem for Linux 2」(WSL 2)はWindowsにLinuxカーネルをもたらした。初代のWSLもLinuxのエミュレーションとしては優秀だったため、2になったからと言って大した影響はないだろうと思う人もいるかもしれないが、それは違う。少なくとも、Dockerのシニアソフトウェア開発者であるSimon Ferquel氏は、まったく違うと述べている。

同氏はエンジニアリングブログの記事で、(コンテナをここまで重要な存在にした企業である)Dockerは、同社の開発プラットフォーム「Docker Desktop」のWindows版を、従来の通常の「Hyper-V」を使用したソリューションから、WSL 2用に用意された軽量なHyper-Vの仮想マシン(VM)を使用した環境に移行する予定であることを明らかにした。

Ferquel氏はその理由について、Microsoftが提供するWSL 2は、事実上軽量なVM内で動作する本物のLinuxカーネルであり、こちらの方が従来のソリューションよりも軽量で、しかもDockerが独自に提供できるよりもWindowsと緊密に統合されているからだと説明している。DockerデーモンはWSL 2上で問題なく動作し、パフォーマンスも申し分ないという。

実際にはどの程度のパフォーマンスなのだろうか。同氏は、コールドスタート後のWSL 2とDockerデーモンの起動について、「圧倒的に高速であり、開発用のラップトップでは、現バージョンのDocker Desktopの起動に数十秒かかるのに対して、2秒以内に立ち上がる」と述べている。

Dockerが言うのだから間違いないはずだ。

ただし、WSL 2に切り替えるという判断は、簡単に行われたわけではなかった。DockerはWSL 2を初期のビルドから評価しており、プロトタイプとしてさまざまなアプローチを試した。その結果として、より高速になったDocker Desktopが開発者の元に届けられようとしている。

Dockerは、Hyper-VのVMが現在担っている部分を、WSL 2の統合パッケージで置き換える予定だ。提供される機能は現在のDocker Desktopと同じで、これには1クリックでKubernetesをセットアップする機能や、自動アップデート、透過的なHTTPプロキシー設定、WindowsからのDockerデーモンへのアクセス、Windowsファイルの透過的なバインドマウントなどの機能が含まれる。

しかし、Docker開発者にとってもっとも重要なのは、Windows用とLinux用の両方のコンテナ化ソフトウェアを同時に開発できるようになることだろう。Ferquel氏は、そうなった暁には、「Linux環境を対象としたプロジェクトに取り組んでいる開発者や、Linux用に合わせたビルドプロセスを使っている開発者は大きなインパクトを受けるだろう。これで、Linux用とWindows用に2つのビルドスクリプトをメンテナンスする必要はなくなる。例えば、あるDockerの開発者は、Linuxマシンを使っている開発者と同じツールとスクリプトを使って、Windows上でLinuxのDockerデーモンを開発している」と述べている。

同氏はまた、WSL 2のバインドマウントは、ネイティブのLinuxマシンとほぼ同等のI/O性能を発揮できると主張している。これで、Docker DesktopでI/Oの入出力が重要なツールチェーンを使用する際の大きな弱点が1つ解消される。この改善によって、NodeJSやPHP、その他のウェブ開発ツールは大きなメリットを受けられるはずだ。

従来のDocker Desktopが抱えていた問題は、性能だけではない。率直に言って、Windowsファイルのバインドマウントは信頼できなかった。Dockerによれば、「現在の実装はWindowsのSambaサービスに依存しているが、このサービスは無効化されたり、企業のGPOによってブロックされたり、第三者のファイアウォールによってブロックされたりする可能性がある」という。一方、WSL 2を使用したDocker Desktopでは、Windowsファイルのバインドマウントの実装に関して新しいアプローチを取っているため、「使い始めれば『そのまま使える』体験を提供できる」と同社は述べている。

それに加え、同社は「Visual Studio Codeと組み合わせて『WSLにリモートから接続する』際にも、Windows上で実行しているIDEから、ローカルマシン上でコンテナをビルドするためのLinux用ツールチェーン一式をDocker DesktopのLinux用ワークスペースで実行できるようになる」としている。

では、WSL 2はなぜこれほど高速化されたのだろうか。

まず、WSL 2はWindows上のネイティブなLinux 4.19カーネルで実行されている。初代のWSLでは、Linuxのシステムコールをそれに対応するWindowsのAPIに変換していた。しかしWSL 2では、軽量Hyper-VのVM上でLinuxを実行しているため、システムコールの変換で時間が取られることがない。

性能が向上したもう1つの大きな要因は、Linuxのファイルシステムに、一般にLinuxで使用されているext4ファイルシステムを採用していることだ。以前は、ファイルのI/Oを行うシステムコールをWindowsのNTFS向けに変換する必要があった。2つのファイルシステムを橋渡しするために、Microsoftは過去から引っ張り出してきた驚くべき手を使った。それは「Plan 9 File System Protocol」(9P)だ。9Pのネットワークファイルシステムサーバーは、どちらのファイルシステムともスムーズに相互運用できる。

この思い切った変更の結果、LinuxとWindowsの両方でネイティブファイルシステム並のI/O性能を得られるようになった。

しかし、新しいDocker Desktopはまだ開発の初期段階にある。WSL 2用Docker Desktopはまだテクニカルプレビューも公開されておらず、ダウンロードできるようになるのは7月の予定だ。Dockerによれば、このプレビュー版は現バージョンのDocker Desktopと共存できるため、既存のプロジェクトは安全に進めることができる。

しかし、もし新しいDocker Desktopが同社の言うとおりのものであれば、Windows ServerとLinuxサーバーの両方に加え、これらを使用しているすべてのクラウドプラットフォームで使えるWindows用のDocker開発プラットフォームになるはずだ。