Docker Desktop WSL 2 バックエンド

読む時間の目安: 4 分

Docker Desktop 利用契約の更新

大規模エンタープライズ (従業員 250名以上、または年間収益 1 千万 US ドル以上) 向けの商用利用に対しては、有償サブスクリプションが必要です。 この有償サブスクリプションには、2022 年 1 月 31 日までの猶予期間が設けられています。 詳しくは こちら を参照してください。

Windows Subsystem for Linux (WSL) 2 は、Microsoft がビルドした完全な Linux カーネルを導入する、画期的な構造変化をもたらします。 これにより Linux コンテナーはエミュレーションとしてではなく、ネイティブな実行が可能になります。 WSL 2 上において Docker Desktop を実行すれば、Linux ワークスペースの活用が可能となり、Linux と Windows の双方に対するビルドスクリプトを準備する必要はなくなります。 また WSL 2 では、ファイルシステム共有や起動時間に関する改善がなされていて、Docker Desktop ユーザーにとって、優れた機能を利用できるものになりました。

Docker Desktop では WSL 2 内の動的メモリ割り当て機能を活用して、リソース消費を劇的に改善しています。 つまり Docker Desktop は、求められている CPU やメモリリソースだけを利用するようになったということです。 そしてコンテナーをビルドする処理のように、CPU やメモリへの負荷が高いタスクは、より速く処理実行できます。

さらに、コールドスタート後の Docker デーモン起動にかかる時間は、かなり速くなります。 Docker デーもの起動時間は、従来の Docker Desktop ではおよそ 1 分は要していたものが、今は 10 秒以下に抑えられています。

前提条件

Docker Desktop WSL 2 バックエンドをインストールするにあたっては、事前に以下の手順を行っておく必要があります。

  1. Windows 10、バージョン 2004 またはそれ以上、あるいは Windows 11 をインストールします。
  2. Windows 上において WSL 2 機能を有効にします。 詳しい手順については Microsoft のドキュメント を参照してください。
  3. Linux カーネル更新プログラムパッケージ をダウンロードしてインストールします。

ベストプラクティス

  • バインドマウント利用時のファイルシステム性能を最大化するには、以下を行います。 なおバインドマウントされたソースコードや関連データは、Windows ファイルシステムではない Linux ファイルシステムを有する Linux コンテナーに(たとえばdocker run -v <host-path>:<container-path>を使って)保存することをお勧めします。 また Microsoft 社の recommendation も参照してください。

    • 元のファイルを Linux ファイルシステムに保存しているのであれば、Linux コンテナーはファイル変更のイベント(「inotify」イベント)のみを受けつけるようにしてください。 たとえばウェブ開発のワークフローにおいては、ファイル変更が発生した際に自動リロードを行う inotify イベントを用いる場合があります。
    • Windows ホストからリモート接続する場合に比べて、Linux ファイルシステムからバインドマウントされたファイルにアクセスする方が、性能ははるかに向上します。 したがってdocker run -v /mnt/c/users:/users(ここで/mnt/cは Windows からのマウント)とすることは避けてください。
    • 上のかわりに Linux シェルからdocker run -v ~/my-project:/sources <my-image>のようなコマンドを実行してください。 ここで~は Linux シェルが$HOMEに展開することを表わします。
  • Docker Desktop のデータ VHDX の容量が気になったり、変更を必要とする場合は、WSL tooling built into Windows を確認してください。
  • CPU や メモリの使用量について気にかける必要がある場合は WSL 2 ユーティリティー VM に割り当てられているメモリ、CPU、スワップサイズの制限を設定することができます。
  • Docker Desktop 上での WSL 2 利用において、衝突のリスクを避けるには、Docker Engine の古いバージョンのアンインストール を行い、Docker Desktop のインストール前に Linux ディストリビューションに対して CLI を直接インストールするようにしてください。

ダウンロード

Docker Desktop 2.3.0.2 またはこれよりも最新版をダウンロードします。

インストール

Docker Desktop 安定版 2.3.0.2 をインストールする 前に、上の前提条件の節に示した各手順をすべて終えていることを確認してください。

  1. Docker Desktop のインストールは、通常のインストール手順に従います。 サポートされているシステム上では、Docker Desktop のインストールの際に WSL 2 を有効にするかどうかが尋ねられます。 画面上に示される説明をよく読み、WSL 2 を有効化した上で操作を続けます。
  2. Windows スタートメニューから Docker Desktop を起動します。
  3. Docker メニューから Settings > General を実行します。

    WSL 2 の有効化

  4. チェックボックス Use WSL 2 based engine を選択します。

    WSL 2 をサポートするシステム上に Docker Desktop をインストールした場合、このオプションはデフォルトで有効になっています。

  5. Apply & Restart をクリックします。
  6. ディストリビューションが WSL 2 モードで動作していることを確認します。 WSL が実行されるモードには v1 モードと v2 モードがあります。

    WSL モードを確認するには以下を実行します。

    wsl.exe -l -v

    現在の Linux ディストリビューションを v2 にアップグレードするには、以下を実行します。

    wsl.exe --set-version (ディストリビューション名) 2

    今後のインストールを考慮して、デフォルトバージョンを v2 に設定しておくには、以下を実行します。

    wsl.exe --set-default-version 2

  7. Docker Desktop が再起動したら、Settings > Resources > WSL Integration を実行します。

    Docker-WSL 統合環境が、デフォルトの WSL ディストリビューション上において有効になります。 デフォルトの WSL ディストリビューションを変更するにはwsl --set-default <ディストリビューション名>を実行します。

    たとえばデフォルトの WSL ディストリビューションとして Ubuntu を設定する場合はwsl --set-default ubuntuを実行します。

    他に Docker-WSL 統合環境を有効にしたいディストリビューションがあれば、その設定を行います。

    メモ

    ディストリビューション内で稼働する Docker-WSL 統合環境は glibc に依存しています。 したがって Alpine Linux のような musl ベースのディストリビューションを動作させる場合には、問題が発生することがあります。 Alpine ユーザーが統合環境を動作させる際には [alpine-pkg-glibc(https://github.com/sgerrand/alpine-pkg-glibc){:target=”blank” rel=”noopener” class=””} パッケージを導入し、musl に合わせた glibc を用いることが必要かもしれません。

    WSL 2 による Linux ディストリビューションの決定

  8. Apply & Restart をクリックします。

Docker と WSL 2 を用いた開発

以下の節では、Docker と WSL 2 を利用したアプリケーション開発方法について説明します。 Docker と WSL 2 を利用して開発作業を進めていく際には、開発コードをデフォルトの Linux ディストリビューション内に配置して進めていくことが最適です。 Docker Desktop において WSL 2 を有効にしていれば、その Linux ディストリビューション内のソースコードでありながら、理想的に Windows 上の IDE の中で作業し続けることができます。 このような作業を進めるには VSCode を用いるのが最も自然な方法です。

  1. VSCode を開いて リモート WSL 拡張機能 をインストールします。 この拡張機能は、Linux ディストリビューション内のリモートサーバーで作業をしつつ IDE クライアントは Windows のままとするものです。
  2. そこで VSCode 内においてリモートに対する作業を開始します。 これを行うにはターミナル画面を開いて以下を入力します。

    wsl

    code .

    この操作によって、デフォルト Linux ディストリビューションに対してリモート接続された新たな VSCode が開きます。 画面下段からこのことが確認できます。

    別の方法として、スタートメニューからデフォルト Linux ディストリビューション名を入力してこれを開き、その後にcodeを実行する方法もあります。

  3. VSCode 内では VSCode のターミナル画面を使うことができます。 これによってソースコードをプルし、Windows マシン内からネイティブ環境のように作業を進めていくことができます。

GPU サポート

Docker Desktop 3.1.0 から Docker Desktop は、NVIDIA GPU に対して WSL 2 GPU 準仮想化(GPU Paravirtualization; GPU-PV)をサポートするようになりました。 WSL 2 GPU 準仮想化を有効にするためには以下が必要です。

  • NVIDIA GPU を搭載するマシン。
  • 開発プレビューリング(Dev Preview ring)から最新の Windows Insider 版。
  • WSL 2 GPU 準仮想化をサポートする NVIDIA の ベータドライバー
  • WSL 2 Linux カーネルの最新版への更新。 昇格権限によるコマンドプロンプトからwsl --updateを実行。
  • Docker Desktop において WSL 2 バックエンドの有効化。

システムが期待どおりに動作するかどうかを確認するには、以下のように GPU に対する簡単なベンチマークを確認するコマンドを実行します。

$ docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
        -fullscreen       (run n-body simulation in fullscreen mode)
        -fp64             (use double precision floating point values for simulation)
        -hostmem          (stores simulation data in host memory)
        -benchmark        (run benchmark to measure performance)
        -numbodies=<N>    (number of bodies (>= 1) to run in simulation)
        -device=<d>       (where d=0,1,2.... for the CUDA device to use)
        -numdevices=<i>   (where i=(number of CUDA devices > 0) to use for simulation)
        -compare          (compares simulation results running once on the default GPU and once on the CPU)
        -cpu              (run n-body simulation on the CPU)
        -tipsy=<file.bin> (load a tipsy model file for simulation)

> NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
MapSMtoCores for SM 7.5 is undefined.  Default to use 64 Cores/SM
GPU Device 0: "GeForce RTX 2060 with Max-Q Design" with compute capability 7.5

> Compute 7.5 CUDA device: [GeForce RTX 2060 with Max-Q Design]
30720 bodies, total time for 10 iterations: 69.280 ms
= 136.219 billion interactions per second
= 2724.379 single-precision GFLOP/s at 20 flops per interaction

フィードバック

みなさんからのフィードバックは大変重要です。 フィードバックをいただくには、Github レポジトリ Docker Desktop for Windows に issue をあげて、WSL 2 というラベルをつけてください。

WSL, WSL 2 Tech Preview, Windows Subsystem for Linux, WSL 2 backend Docker