wslのDockerでGUI操作

# 導入
(🦕は私です)
🦕「DockerでGUI操作してぇなぁ」
🦕「WSLの機能、WSLg ってのがあるんか。じゃあできそうやな。」
ということで、記事にしました。
　恐らく、OpenCV や PyAutoGUI 更には VLC や GIMP が実行できます。
→2023年2月24日: これについて [こちら に追記しました](#2023年2月24日追記)

　最後に解説もつけてます。
ほぼ初心者Dockerでしたので、色々時間かかりました。
是非読んで、私を報ってあげてください。
　また、一応[GitHub](https://github.com/rayfiyo/dockerGuiTest)に公開しました。
GitHubでは compose を使わない方法も紹介しています。(2023年2月25日追記)
[repositoryはこちら](https://github.com/rayfiyo/dockerGuiTest)

# 環境
## 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](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
🦕「この記事の前提条件クリアしとけばええやろ。」
🦕「よう わからんが、こういうことか？」
- ビルド 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](https://github.com/rayfiyo/dockerGuiTest) に書いたで」
~~~
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 の項 の話
[リンクはこちら](#docker-compose)
## volumes
/mnt/wslg と /tmp/.X11-unix のボリュームをマウントして、ライブラリ等をローカルで準備してる。
## environment
- 環境変数の定義
- 右辺( $〇〇 )はWSLの値
- 左辺と右辺は、同じ名前で定義している
- Wayland関係 や ディスプレイの番号など

# 解説-動作確認
蛇足: Dockerfileで動作確認 の項 の話
[リンクはこちら](#蛇足Dockerfileで動作確認)
別に x11-apps である必要はないが、軽そうなGUI描画だったので。
## x11-apps
- X11で作られたアプリの塊
- xeyes も含まれている
## CMD xeyes
- イメージのビルドではなく、コンテナ起動時に実行したいので CMD
- xeyes は アプリ。

# 参考文献
## WSLg
[Linux 用 Windows サブシステムで Linux GUI アプリを実行する | Microsoft](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
[なぜWindows 11でLinuxのGUIが動く？その仕組みと活用法を探る | 日経クロステック](https://xtech.nikkei.com/atcl/nxt/column/18/01937/020100002/)
[WSLgアーキテクチャ | OPCDiary](https://opcdiary.net/wslg%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3/)
[microsoft/wslg | WSLgのGitHub repository](https://github.com/microsoft/wslg)
## wayland
[Wayland | Wayland](https://wayland.freedesktop.org)
[wayland/westonとは？ | エンジニア情報局](https://eng-info-office.com/ww-overview/)
## volumes
[Volumes | docker](https://docs.docker.com/storage/volumes/)
[docker-composeでvolumesを設定する | zenn あじゃぱー](https://zenn.dev/ajapa/articles/1369a3c0e8085d)
[Docker、ボリューム(Volume)について真面目に調べた | Qiita @gounx2](https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32)

# 2023年2月24日追記

:::note info
wslのDockerで、以下の5つの実行を確認しました。
なお、 **PyAutoGUI** と **VLC** は**注意**が必要です。
- OpenCV
- PyAutoGUI
- VLC
- GIMP
- Firefox
:::

## PyAutoGUI
注意点が2点あります。

:::note warn
　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)が変化します。
要するに、

:::note warn
　1. 新規ユーザーが必要
　2. 環境変数の 再定義 or 引き継ぎ が必要
:::

私は、以下のような感じで ユーザーを作成 して、 環境変数を引き継ぎ切り替え をしました。
~~~
adduser username
su --preserve-environment username
~~~