目次
1. はじめに
Windows 10 version 2004 では、WSL 2 が使えるようになりました。Linux コマンドをエミュレートしている WSL 1 と違い、WSL 2 では仮想マシンで Linux を動かします。その影響で、WSL 2 を取り巻く Docker 環境の導入方法にいろいろな変化があったのですが、このあたりが分かりにくかったので本ページで簡単にまとめます。
1-1. Docker についての基礎知識
Docker はサーバーとクライアントに分かれて動作します。「docker イメージ」や「dockerコンテナ」はサーバー上に配置され、クライアント側から送られる docker コマンドによって操作されます。サーバーとクライアントは同じホスト上にあってもよいですし、別々のホストにあっても問題ありません。
1-2. 前提
WSL 2 にインストールした Linux ディストリビューション(例えば Ubuntu)のことを、以後「WSL 2 ディストロ」と表します。
本ページでは「クライアント」として WSL 2 ディストロ(Ubuntu)を使うことをメインに考えて書いています。
2. WSL 2 ディストロ(Ubuntu) + パッケージのDocker を利用するパターン
WSL 2 は仮想マシンで動く普通の Linux であるので、例えば Ubuntu であれば、apt
コマンドで docker (サーバーもクライアントも)をパッケージとしてインストールすることができます。
この手順は、Install Docker Engine on Ubuntu | Docker Documentation に載っています。
注意点
リンク先ページの説明の中で sudo docker run hello-world
というコマンドを実行していますが、この前に sudo service docker start
を実行して Docker server を稼働させておく必要があります。
これは Linux にとってごく普通のアプリケーションインストールの操作であり、この方法で Docker が導入できるのであれば何も問題はないように思えます。しかし、WSL 2 という(ソフトウェア的に)限られたリソースしか使えない仮想マシンの中に Docker(サーバー)を導入するよりも、ホストであるWindows 側に導入した方がリソースを有効に活用することができます。ということで、Docker Desktop というツールが用意されています。とはいえ、WSL 2 ディストロ用パッケージの docker で問題なければ、Docker Desktop を使う必要はないようにも思います。
※ 環境変数 DOCKER_HOST の設定は必要ありません。
3. WSL 2 ディストロ(Ubuntu) + Docker Desktop (WSL 2 Backend) を利用するパターン
Docker サーバーとして、Docker Desktop を利用する方法です。Docker Desktop の導入方法は、Docker Desktop WSL 2 backend | Docker Documentation に載っています。
以前の Docker Desktop は、Hyper-V を利用して Linux仮想マシンを作成し、その中に Docker サーバーを用意する形をとっていましたが、現在では WSL 2 用に用意された「仮想マシン プラットフォーム(Hyper-V のサブセット)」機能で Docker サーバーを動かす方式も選べるようになりました。本ページでは、この方式を「Docker Desktop (WSL 2 Backend)」と呼んでいます。
選べるようになったと言っても、WSL 2 ディストロを使っているのであれば、 実質的にこちらの選択肢しかなさそうです。なぜかというと、WSL 2 では localhost という名前で Windows 側にアクセスできなくなった関係で、Hyper-V を使った Docker Desktop を利用するには設定変更のハードルが高いのです。Windows のファイヤーウォール設定を変更すれば可能かもしれませんが、わざわざそんなことをするのは面倒です。
Docker Desktop (WSL 2 Backend) を使うには、Docker Desktop の [Settings] – [General] にある [Use the WSL 2 based engine] にチェックを入れて、[Apply & Restart] ボタンをクリックします。
「WSL 2 based engine」とあるように、この機能を有効にした場合は、WSL 2 の仮想マシンとして Docker サーバーが動くようです。PowerShell で WSL のディストリビューション一覧を表示するとそれが分かります。
PS> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2
docker-desktop-data Running 2
docker-desktop Running 2
docker-desktop-data と docker-desktop という2つのディストリビューション(?)が、WSL 2 のバージョンで動いているのが分かります。
この方式だと、Hyper-V は必要ありませんし(Windows 10 Home でも動くことを意味します)、WSL 2 ディストロと同じ WSL 2 を利用することで高いパフォーマンスが期待できるそうです。Docker をちゃんと使いたいのであれば、パッケージの docker サーバーよりもこちらの方が良いのでしょう。
※ 環境変数 DOCKER_HOST の設定は必要ありません。
WSL Integration
Docker Desktop の設定で、[WSL Integration] を有効にすると、WSL 2 ディストロ内で、docker-desktop というディストリビューション(?)の docker-desktop-proxy
というプログラムが実行されるようです。
補足
WSL 1 + Docker Desktop (WSL 2 Backend) の組み合わせは試していません。あまり需要のない組み合わせだとは思いますが、そうでもないのでしょうか。
4. WSL 1 ディストロ(Ubuntu) + Docker Desktop (Hyper-V) を利用するパターン
こちらは従来からあるパターンで、WSL 1 のディストロと Hyper-V ベースの Docker Desktop を利用するパターンです。一応、本ページにも書いておきます。Docker Desktop は、先ほど説明した [Use the WSL 2 based engine] にチェックを入れなければこちらの動作になります。
Hyper-V マネージャーを開くと、DockerDesktopVM という仮想マシンが作成されて動いているのが分かります。
Hyper-V を使うということで、Windows 10 Home では利用することができません。
こちらに関しては、以下のページを参照してください(ちょっと古いですが)。
5. おわりに
今回いろいろな情報にあたりましたが、Windows 10 version 2004 の WSL で Docker を使うのであれば、「WSL 2 ディストリ(Ubuntu)」+「Docker Desktop (WSL 2 Backend)」の組み合わせが自然な選択であると感じました。