Win11+WSL2にDocker Desktopをインストール

WSL 2Docker,Linux,Windows,Windows 11,WSL2

WSL2が公開されて以来、Windows版DockerもWSL2上で動くようにバージョンアップされました。従来のDockerに比べて、WSL2バックエンドなDockerは、起動が速く軽量、などの特徴があるそうです。

以前、Windows 10のWSL2環境にDocker Desktopをインストールする記事を書きましたが、その時に比べてWindowsのInsider Preview版ではWSL2のセットアップも簡易化され、手順が変わっています。

ということで、Windows 11のInsider Preview版を例にとって、WSL2バックエンドなDocker Desktopをインストールする方法をまとめました。

まえがき

本記事は、Windows 11 Pro Insider Preview(ビルド22000.71)で確認しています。プレビュー版ですので、今後手順が変わる可能性があることをご了承ください。

また、この記事は、記事執筆時点のWindows 10 Insider PreviewやWindows 11を前提に記述しています。現時点の通常リリース版であるWindows 10 21H1ではできない箇所もありますので、21H1をご利用の方は、こちらの記事をご覧ください。

Windows 11にWSL2をインストール

Docker DesktopはWSL2上で動作しますので、まず始めにWindows 11にWSL2を入れる必要があります。

WSL2の初期セットアップに関してはこちらの記事にまとめています。この記事の「WSL2 と Ubuntu 20.04 を インストール」の項を事前に行ってください。

上記記事では、Ubuntu 20.04を指定してインストールを行っていますが、Docker Desktopを使う上では何のディストリビューションを入れていても構いません(Docker Desktop専用ディストリがインストールされますので、Ubuntu等は不要です)。ですので、特にこだわりがなければ、インストールのコマンドはwsl --installだけでも構いません。この場合、無印の「Ubuntu」ディストリがインストールされます。

次の画面の所まで進んだら戻ってきてください。(このUbuntu画面はもう使いませんので、閉じて構いません)

この画面まで進んだら、閉じて次項に進んでください

Docker Desktopをインストール

WSL2のセットアップが終了したらDocker Desktopをインストールします。

ところで、Microsoftは現在、「Windows Package Manager(通称winget)」というパッケージ管理ソフトを開発中のようです。パッケージ管理ソフトといえば、Ubuntuならapt、CentOSならyumやdnfコマンドに相当するソフトです。このwingetを使えば、Windows上でもwinget install <アプリ名>の1コマンドでアプリがインストールでき、Docker Desktopもインストール可能です。せっかくなので、今回はwingetを使ってDocker Desktopをインストールしてみたいと思います。

wingetは、Microsoftストアから「アプリ インストーラー」を最新版に更新すると使えるようになります。Microsoftストアのライブラリのページから各種アプリをアップデートするか、「App Installer」で検索して「アプリ インストーラー」を更新します(日本語で「アプリ インストーラー」と検索欄に入れても出てきませんので気をつけてください)。

Microsoftストアで「アプリ インストーラー」を更新します

「winget」が使えるか確認するため、スタートボタンを右クリックしてWindows Terminalを起動します。(今回は一般ユーザー権限で開いていますが、管理者権限で開くとDocker Desktopインストール時のUACメッセージが出なくなります)

スタートボタンを右クリックし、Windows Terminalを開きます

PowerShellが立ち上がります。正常にwingetインストールされているか確認するため、winget -vを実行してみます。下記のようにバージョン名が表示されたらOKです。

PS C:\> winget -v
v1.0.11591
wingetがインストールされているか確認します

続いて、Docker Desktopのパッケージ名を調べるため、winget search dockerを実行してみます。

PS C:\> winget search docker
名前                ID                        バージョン  一致
-------------------------------------------------------------------------
Docker Desktop      Docker.DockerDesktop      3.5.2       Moniker: docker
eintopf             mazehall.eintopf          1.3.2       Tag: docker
Compose Generator   ChilliBits.ComposeGenera… 0.8.0       Tag: docker
Docker Desktop Edge Docker.DockerDesktopEdge  2.5.4.50534
SimpleDockerUI      felixgborrego.simple-doc… 0.5.5
wingetでDocker Desktopを探します

上記を見ると「Docker.DockerDesktop」パッケージをインストールすれば良さそうです。それをインストールするため、winget install Docker.DockerDesktopを実行します。(単に「docker」と入力しても大丈夫ですが、念のためフルネームで指定しています)

PS C:\> winget install Docker.Desktop
wingetでDocker Desktopをインストールします

インストール中、UACの昇格が必要になりますので、「はい」をクリックします。

インストール中、UACメッセージが出てきますので「はい」をクリックします

しばらくすると、インストールが完了します。

Docker Desktopのインストールが終わりました

インストールが終わったら、一旦パソコンを再起動します。

サンプルを動かしてみる

再起動後、自動でDocker Desktopが起動します。

Docker Desktop起動中

下記の表示になったら起動完了です。今回はチュートリアルは省略しますので、「Skip tutorial」をクリックします。(前掲のWindows 10版Docker Desktopセットアップ記事では、チュートリアルも行っています。良ければご覧ください)

初回起動時はチュートリアルが始まりますが、今回はスキップします

タスクバーにも、Docker Desktopのアイコンが表示されていると思います。コンテナ積みのクジラマークが表示されていれば、正常に動作しています。

タスクバーにもDocker Desktopアイコンがあると思います

タスクバーのクジラマークをクリックしても、Docker Desktopのダッシュボードを開くことができます。

Docker Desktopのダッシュボード

最後に、サンプルのコンテナを動かしてみたいと思います。もう一度Windows Terminalを開いて、Docker Desktopの画面にあるコマンドを実行します。

PS C:\> docker run -d -p 80:80 docker/getting-started
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
540db60ca938: Pull complete
0ae30075c5da: Pull complete
9da81141e74e: Pull complete
b2e41dd2ded0: Pull complete
7f40e809fb2d: Pull complete
758848c48411: Pull complete
23ded5c3e3fe: Pull complete
38a847d4d941: Pull complete
Digest: sha256:10555bb0c50e13fc4dd965ddb5f00e948ffa53c13ff15dcdc85b7ab65e1f240b
Status: Downloaded newer image for docker/getting-started:latest
2865825f2c90733ecb786010b0b456da866c0f21d961dc8706087cd71ba2a24c
サンプルのDockerコンテナを動かしてみます

初回は、Windows セキュリティがファイアウォールの警告を出してきます。お使いのPC以外からDockerコンテナへのアクセスを受けたい場合は、適切に許可設定をしてください。

初回起動時は、ファイアウォール設定を聞かれます。別PCからDockerコンテナにアクセスしたい場合は、適切に設定してください

さて、Docker Desktopの画面に戻ると、Containers / Apps 画面に、サンプルイメージから作成したDockerコンテナが作成され、動作中の表示になっていると思います。ここからOPEN IN BROWSERボタンを押してWebページが正しく表示されたら、Docker Desktopのセットアップは問題なく完了です。

Docker Desktopダッシュボードから「OPEN IN BROWSER」をクリックします
この画面が表示されたら、正常に動作しています

サンプルコンテナが不要でしたら、Docker Desktopの画面からDELETEボタンを押してください。Imagesの方にある、元になっているDockerイメージも不要なら削除して構いません。

サンプルが不要でしたら、コンテナやイメージは削除して構いません

DockerコンテナでCUDA(GPU)を使う

WSL2バックエンドでDockerを動かしていて、なおかつCUDA on WSLの設定を行っていれば、DockerコンテナでCUDAを使うこともできます。

次の記事でCUDA on WSLの設定方法を紹介していますので、この記事を参考にCUDA on WSLのセットアップを行ってください。

Docker DesktopとCUDA on WSLの両方の設定が終わったら、一度WSL2の再起動(もしくはパソコンの再起動)が必要のようです。UbuntuやDockerコンテナ等で未保存のものがないか確認して、wsl --shutdownを実行します。

PS C:\> wsl --shutdown

上記コマンドで、Dockerも落ちます。「Docker Desktopを再起動するか」というトーストメッセージが出てきますので「Restart」をクリックします。

WSL2をシャットダウンすると、Docker Desktopも終了し、再起動するか聞かれます

タスクバーのDocker Desktopアイコンが起動済みアイコン(コンテナが積まれたクジラマーク)になったら、早速GPUを使ってDockerコンテナを動かしてみたいと思います。

ここでは、CUDAツールキットのサンプルにあるnbodyを動かします。初回は、Dockerイメージのダウンロードのため、少し時間がかかります。

PS C:\> docker run --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
Unable to find image 'nvcr.io/nvidia/k8s/cuda-sample:nbody' locally
nbody: Pulling from nvidia/k8s/cuda-sample
d519e2592276: Pull complete
d22d2dfcfa9c: Pull complete
b3afe92c540b: Pull complete
b25f8d7adb24: Pull complete
ddb025f124b9: Pull complete
fe72fda9c19e: Pull complete
c6a265e4ffa3: Pull complete
c931a9542ebf: Pull complete
f7eb321dd245: Pull complete
d67fd954fbd5: Pull complete
Digest: sha256:a2117f5b8eb3012076448968fd1790c6b63975c6b094a8bd51411dee0c08440d
Status: Downloaded newer image for nvcr.io/nvidia/k8s/cuda-sample:nbody

ダウンロードが終わったら、自動的にコンテナが作成され、nbodyが実行されます。下記のように結果が出てきましたので、問題なくGPUでDockerコンテナが動いているようです。

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
GPU Device 0: "Maxwell" with compute capability 5.0

> Compute 5.0 CUDA device: [NVIDIA GeForce GTX 960M]
5120 bodies, total time for 10 iterations: 6.274 ms
= 41.781 billion interactions per second
= 835.611 single-precision GFLOP/s at 20 flops per interaction
DockerでCUDAが使えているか確認します

NVIDIAのWSLユーザーガイドには、そのほかのサンプルの実行例も掲載されていますので、合わせてご覧ください。

参考サイト

Docker Desktopのインストールに関しては、こちらを参考にしました。Docker DesktopでCUDAを使う方法も紹介されています。

次のサイトは、wingetの紹介ページです。

こちらは、NVIDIAのCUDA on WSLのセットアップ記事です。こちらでも、Docker DesktopでCUDAを使う方法も紹介されています。