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の部分は人によって異なります)。

[email protected]:/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 開発も行えるようになりました。

以上です。お疲れ様でした。