目次
WSLg とは
WSL2 で使用することのできる、Windows 上で Linux の GUI アプリケーションを実行するための仕組みです。
WSL2 では Linux カーネルを実行することができる仮想環境をネイティブサポートしています。
つまり、 WSL2+WSLg により、 GUI アプリを含めた多くの Linux 開発が Windows 上で容易に行えます。素敵ですね。
WSLg は Windows 11 で使うことができます。Windows 10 の場合は Preview版で提供されていますが、今回の記事は Windows 11 のみを対象とします。
Dockerでの開発でWSLgを使いたい
WSL2 で Docker を使用していて、GUI アプリケーションを使ったり、GUI アプリケーションを開発したりしたいというときがあります。
そんなとき、コマンド数個で Docker+WSL2+WSLg 環境を構築できるように、最小の設定項目だけを記載したテンプレートを作成しました。
テンプレートの使い方
前準備
必要な要件は次の通りです。
- Windows 11
- 最新の WSL2
- WSL 連携済みの Docker Desktop
まず、WSLg がそもそも有効なのかを確かめましょう。WSL2 を起動し、以下のコマンドを入力してください。
$ sudo apt install -y x11-apps
$ xeyes
次の画像のような目が表示されたら WSLg が有効です。このまま「テンプレートを使って Docker コンテナを作成する」の項目に進んでください。
もしエラーが表示された場合、WSL2 のバージョンが最新ではない可能性があります。
Powershell かコマンドプロンプトを管理者権限で起動して、次のコマンドを実行してください。WSL2 をアップデートして、シャットダウンします。
$ wsl --update
$ wsl --shutdown
これでまた xeyes を実行して、実行されれば OK です。
実行されない場合は別の原因の可能性があるため、表示されたエラーメッセージで検索してみてください。
テンプレートを使って Docker コンテナを作成する
Use this template ボタンを押してフォークしてから clone するか、code の項目から直接 clone してください。 なお、このテンプレートでは Ubuntu 20.04 を使用しています。
次にダウンロードしてきたプロジェクト内で次のコマンドを実行します。
$ docker-compose up -d --build
$ docker-compose exec docker-for-wslg /bin/bash
すると、作成したコンテナ内で bash シェルが起動します(f2c8ca5409b6の部分は人によって異なります)。
root@f2c8ca5409b6:/opt#
あとはこの bash 上で好きなように GUI アプリを実行できます。例えば xeyes も実行できます。試してみましょう。
$ apt install -y x11-apps
$ xeyes
先程見たおめめが表示されれば成功です。
この環境の中でホストのファイルを編集したい・実行したい場合は、適宜 dokcer-compose.yml に volume を追加してください。
テンプレートの解説
このテンプレートでは、実はやっていることは多くありません。
docker-compose でコンテナの環境変数をいくつか指定しつつ、ホストである WSL2 の WSLg に関する環境をコンテナに同じパスでマウントしているだけです。
表示に関する Wayland プロトコルと X Window System プロトコルをサポートし、オーディオに関する PulseAudio プロトコルもサポートしています。
environment:
- DISPLAY=$DISPLAY
- WAYLAND_DISPLAY=$WAYLAND_DISPLAY
- XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
- PULSE_SERVER=$PULSE_SERVER
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
- /mnt/wslg:/mnt/wslg
NVIDIA GPU サポート
さらに GPU もサポートしたテンプレートを作成しました。GPU を用いた描画ができます。
このテンプレートは次の公式解説を参考にしています。
テンプレートを使って vGPU サポートがされた Docker コンテナを作成する
こちらのテンプレートの使用には Docker Compose V2 か Docker Compose のバージョン 1.18.0 以降が必要です。
Docker Compose V2 は
docker compose
と、docker-compose のハイフンをスペースに変えるだけで呼び出せるので、1.28.0 以上へのアップグレードより Docker Compose V2 の使用をおすすめします。
今回は Linux ディストリビューションとして Ubuntu 20.04 を選択しました。他のイメージを使用したい場合 Dockerfile の FROM 部分を書き換えてください。
他のイメージの例としては nvidia/cuda イメージがあります。機械学習や cuda によるプログラミングもしたい場合は、次のページから希望する nvidia/cuda イメージを探して使うと良いかもしれません。
インストール方法や使い方は docker-for-wslg とほぼ同じです。
$ docker compose up -d --build
$ docker compose exec gpu-wslg /bin/bash
GPU を使ってみる
描画に使える GPU の情報を取得してみましょう。
$ apt install -y mesa-utils
$ glxinfo -B
ここで次のように NVIDIA の GPU デバイス名が表示されている場合、GPU を用いた OpenGL での描画が行えるようになっています。
Device: D3D12 (NVIDIA GeForce RTX 2070) (0xffffffff)
一方で、次のように llvmpipe が表示されている場合、GPU を用いた描画が行えるようになっていません。
Device: llvmpipe (LLVM 12.0.0, 256 bits) (0xffffffff)
続いて GPU を使ったアプリケーションを実行してみます。
アプリケーションの実行前に Windows の タスクマネージャーのパフォーマンスタブを開いておいて、GPU の使用率を眺めてみてください(nvidia-smi などでも可)。
$ glxgears
このような歯車の動画が表示され、 GPU の使用率が増加していることが確認できるかと思います。
これで GPU を用いた GUI 開発も行えるようになりました。
以上です。お疲れ様でした。