Tools

WSL 2 で Docker を使うパターン

投稿日:2020年8月5日 更新日:

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] ボタンをクリックします。

[Settings] – [General] – [Use the WSL 2 based engine]

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-datadocker-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 というプログラムが実行されるようです。

$ ps aux | grep -i docker
root      2767  0.0  0.2 563520 19912 pts/1    Ssl+ 18:12   0:00  /mnt/wsl/docker-desktop/docker-desktop-proxy --distro-name Ubuntu  --docker-desktop-root /mnt/wsl/docker-desktop

補足

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 という仮想マシンが作成されて動いているのが分かります。

DockerDesktopVM という仮想マシンが作成されています

Hyper-V を使うということで、Windows 10 Home では利用することができません。

こちらに関しては、以下のページを参照してください(ちょっと古いですが)。

docker

WSL の docker client から、Docker for Windows の docker daemon を使う手順

2018.07.19

5. おわりに

今回いろいろな情報にあたりましたが、Windows 10 version 2004 の WSL で Docker を使うのであれば、「WSL 2 ディストリ(Ubuntu)」+「Docker Desktop (WSL 2 Backend)」の組み合わせが自然な選択であると感じました。

6. 参考

📂-Tools

執筆者:labo


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

データベース管理ツール Adminer

目次1. Adminer とは?2. Adminer の特徴A. たった1つのPHPファイルで動作するB. MySQL の多くの機能に対応しているC. 対応データベースが多いD. ユーザーインターフェ …

Windows

Google の「バックアップと同期」で同期エラーになった時の対応

目次1. はじめに2. 同期エラーの状況3. 対応方法4. おわりに 1. はじめに ローカルのデータを、Google ドライブと同期させる「バックアップと同期」というアプリケーションがあります。 最 …

no image

VSCode の設定・使い方

VSCode の設定・使い方について執筆予定です。 その他の機能 Emmet はデフォルトでサポートされている Emmet によるサジェスト

Windows

wsl-terminal を更新する

目次1. はじめに2. 環境3. バージョン4. 作業1. エクスプローラーのコンテキストメニュー2. 既存の wsl-terminal ディレクトリを退避3. 最新版 wsl-terminal の導 …

GitHub や Bitbucket に gitコマンドでsshアクセスする際、どのアカウントが使われるか確認する方法

目次1. はじめに2. GitHub の場合3. Bitbucket の場合4. GitLab の場合5. その他のメモ6. 関連7. 参考 1. はじめに GitHub や Bitbucket に …