導入
(🦕は私です)
🦕「DockerでGUI操作してぇなぁ」
🦕「WSLの機能、WSLg ってのがあるんか。じゃあできそうやな。」
ということで、記事にしました。
恐らく、OpenCV や PyAutoGUI 更には VLC や GIMP が実行できます。
→2023年2月24日: これについて こちら に追記しました
最後に解説もつけてます。
ほぼ初心者Dockerでしたので、色々時間かかりました。
是非読んで、私を報ってあげてください。
また、一応GitHubに公開しました。
GitHubでは compose を使わない方法も紹介しています。(2023年2月25日追記)
repositoryはこちら
環境
Windows11
WSL2
wsl --version の実行結果のうち一部
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Docker周辺の環境
docker --version; docker-compose --version; の実行結果
Docker version 20.10.22, build 3a2c30b
Docker Compose version v2.4.1
WSLgの実行環境確認
参考: WSL で Linux GUI アプリを実行する | Microsoft Learn
🦕「この記事の前提条件クリアしとけばええやろ。」
🦕「よう わからんが、こういうことか?」
- ビルド 19044 以降またはWindows 11 Windows 10
- WSLは WSL2 にしている
- いい感じにドライバーが入っている
WSLg の動作チェック
🦕「WSL上で適当な GUIアプリ 動けばええやろ。」
🦕「Firefox とか vlc とか gimp とかなんでも。」
- sudo apt install Firefox -y
- sudo apt install vlc -y
- sudo apt install gimp -y
docker-compose
🦕「compose.yml に WSLg の設定書くで。」
🦕「volumes と environment の要素以外はお好きにどーぞ。」
2023年2月25日追記:
🦕「一応、compose 使わない方法を GitHub に書いたで」
version: "3.8"
services:
gui:
build: ./
volumes:
- /mnt/wslg:/mnt/wslg
- /tmp/.X11-unix:/tmp/.X11-unix
environment:
- DISPLAY=$DISPLAY
- PULSE_SERVER=$PULSE_SERVER
- WAYLAND_DISPLAY=$WAYLAND_DISPLAY
- XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR
🦕「以上で設定は終わりやで。おつかれ~。」
蛇足: Dockerfileで動作確認
🦕「ほな、動作確認しとくか。」
FROM debian:latest
RUN apt update -y &&\
apt-get install x11-apps -y ;
CMD xeyes
🦕「書き終わったら適当に、 docker-compose up -d」
🦕「したら、👀 が出てくる筈や。」
解説-WSLg
- "Windows Subsystem for Linux GUI" の略称
- Windows で LinuxのGUIアプリ を WSL を通して、手軽に実行できるようにする技術
- WSLg が無い場合は VcXsrv や XQuartz が必要で面倒
- (LinuxのGUIアプリは、X11 か Wayland の二択)
詳しく
WSLgは、WSL(= ユーザーディストロ)が起動されたとき、システムディストロとして、小さなLinuxディストリビューションを起動する。
このシステムディストロが、ディスプレイサーバ(= GUI専用サーバー、WindowsとWSLの仲介的な)として働く。
こいつ(ディスプレイサーバ)は、Westone という wayland-project の技術が中心。
Westone から、(ユーザー側の)Waylandとやり取りをする。
Westone から、XWayland を経由して X11 とやり取りをする。
因みに、Wayland も wayland-project。
Westone と Wayland と project
- Westone:: 実装そのもの
- Wayland:: I/Fプロトコル
なお、プロトコルのライブラリや、wayland-project などを Wayland ということも。
また、これらは X11 の置き換え(セキュリティ面や速度面など)を目的に作られた。
X11後方互換性として、XWayland というものがある。
解説-X11
- 正しくは、X Window System
- 別称は幾つかある: "X11" "X" "Xサーバー" "X Version 11" "X Window System, Version 11"
- Wayland と同じような感じ
- Xは1984年開発開始、X11は1987年9月登場
- この技術を用いて作られたのが x11-apps で、動作確認の xeyes はその一つ
解説-(docker-compose)
docker-compose の項 の話
リンクはこちら
volumes
/mnt/wslg と /tmp/.X11-unix のボリュームをマウントして、ライブラリ等をローカルで準備してる。
environment
- 環境変数の定義
- 右辺( $〇〇 )はWSLの値
- 左辺と右辺は、同じ名前で定義している
- Wayland関係 や ディスプレイの番号など
解説-動作確認
蛇足: Dockerfileで動作確認 の項 の話
リンクはこちら
別に x11-apps である必要はないが、軽そうなGUI描画だったので。
x11-apps
- X11で作られたアプリの塊
- xeyes も含まれている
CMD xeyes
- イメージのビルドではなく、コンテナ起動時に実行したいので CMD
- xeyes は アプリ。
参考文献
WSLg
Linux 用 Windows サブシステムで Linux GUI アプリを実行する | Microsoft
なぜWindows 11でLinuxのGUIが動く?その仕組みと活用法を探る | 日経クロステック
WSLgアーキテクチャ | OPCDiary
microsoft/wslg | WSLgのGitHub repository
wayland
Wayland | Wayland
wayland/westonとは? | エンジニア情報局
volumes
Volumes | docker
docker-composeでvolumesを設定する | zenn あじゃぱー
Docker、ボリューム(Volume)について真面目に調べた | Qiita @gounx2
2023年2月24日追記
wslのDockerで、以下の5つの実行を確認しました。
なお、 PyAutoGUI と VLC は注意が必要です。
- OpenCV
- PyAutoGUI
- VLC
- GIMP
- Firefox
PyAutoGUI
注意点が2点あります。
1. pip install python-xlib が必要。
2. Docker以外のウィンドウは操作できない。
2についてですが、
例えば、
1. Windowsで、ブラウザを起動
2. Dockerで、PyAutoGUIを実行
→ PyAutoGUIはブラウザ(ウィンドウ)を操作できない
しかし、
1. Dockerで、ブラウザを起動
2. Dockerで、PyAutoGUIを実行
→ Dockerで起動したブラウザ(ウィンドウ)のみ操作できる
また、
1. Dockerで、ブラウザを起動
2. WSLで、(WSLのpython)PyAutoGUIを実行
→ Dockerで起動したブラウザ(ウィンドウ)のみ操作できる
さらに、
1. Dockerで、ブラウザを起動
2. WSLで、(Windowsのpython.exe)PyAutoGUIを実行
→ Windowsの画面を操作できる(Dockerのウィンドウも)
VLC
Dockerは rootユーザーしか無いです。
しかし、VLC は rootユーザーでの実行は不可能です。
また、別のユーザーになると環境変数(docker-compose 内の environment)が変化します。
要するに、
1. 新規ユーザーが必要
2. 環境変数の 再定義 or 引き継ぎ が必要
私は、以下のような感じで ユーザーを作成 して、 環境変数を引き継ぎ切り替え をしました。
adduser username
su --preserve-environment username