LoginSignup
7
4

More than 1 year has passed since last update.

理解しながら動かすGUIアプリ on Docker

Last updated at Posted at 2022-04-10

「パソコンが立ち上がらない」という相談に駆けつけてみると押していたのがディスプレイの電源スイッチだったというジョークがありますが、Xがわからなかった私はこのジョークを笑う資格はありませんでした。

怒り散らかしながらディスプレイの電源スイッチを連打するレベルからレベルアップし無事Xのシステムを完全に理解し(※)、リモートGPUサーバのk8s上で動くアプリのGPUアクセラレーションを有効にしてクライアントからのぞくことに成功し、ある程度消化できたので、ハードウェアアクセラレーションを使わない範囲での仕組みについて、まとめを書きます。

※ ダニング=クルーガー効果なので気にしないでください

LinuxのGUIシステム

LinuxのGUIの仕組みは現在進行系でも進化しており、近年また大きな変化の波が押し寄せています(Wayland)。今のところ新しい仕組みよりも枯れた方が知見が多く見つけられるので、XOrgという仕組みを前提にします。
LPIC-1 v5 - 106 User Interfaces and Desktopsに詳しいです。Ubuntuが起動しLinux操作時にGUIが表示されて手を叩いて喜んでいるとき我々はLCDを見ています。このLCDに表示されている内容はDRMを通してカネールが指示をしてVRAMにレンダリングされたものです。

001.png

このとき、デスクトップ(= ウィンドウ)、GUIのウィンドウ、クライアント領域内の「絵」はWindow Managerがコンポジット(合成)してくれた内容で、XServerにアプリケーションからUnix Domain Socketを通してリクエストしたものです。

Dockerコンテナ内GUIアプリをLinuxホストで表示

同様にDockerコンテナでGUIアプリケーションを動かすときには、DockerコンテナからUnix Domain Socketを透過させてホスト側のX Serverにリクエストを出すことで実現します。

002.png

XServerへのアクセス権限管理があり、コンテナ内アプリに与えるユーザー権限に気を使う
事例もあります。

docker run -it \
    --user=$(id -u $USER):$(id -g $USER) \
    --env="DISPLAY" \
    --volume="/etc/group:/etc/group:ro" \
    --volume="/etc/passwd:/etc/passwd:ro" \
    --volume="/etc/shadow:/etc/shadow:ro" \
    --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    [イメージ名] \
    [GUIアプリ]

Windows 11 WSLg

さて、ここで今ではWindows11だけで(?)使えるWSLgという仕組みを差し込ませてもらいます。これもかなり込み入った仕組みだけれどもXの仕組みを理解するのに大事な内容で、それまで仮想ネットワークを通してTCPパケットを通じてアプリケーションを表示していました (WSL2におけるVcXsrvの設定 - Qiita)

004.png

これがWindows 10でオーディオやグラフィックスアプリを含むLinuxのGUIアプリを使用可能にする「WSLg」機能が登場 したことにより、大幅変わったのです。

じゃーん。

003.png

基盤に新世代のXの仕組みwaylandを採用し、旧来型のXOrg的なアプリケーションとのコミュニケーションにはトランスレータ(XWayland)を挟んでおります。Windowマネージャーの役割はWaylandの標準実装通りWestonに取り込まれました。ここで注目すべき(?)はRDPの存在で、これまでのWindowsのリモートデスクトップの枠組みを拡張して(?)、VAILやRAILといった仕組みでデスクトップではなくWindowレベルでの「リモートデスクトップ」を実現しているということです。

この他、Xパケットの転送のみでは実現できなかった「音情報」の転送も組み込んでいます。

Docker on WSL2 on Windows 10?

Docker Desktopを企業活動で利用するのが有料になったことから、Docker Desktop を使わずに Windows で Docker する - プログラム の超個人的なメモという魔術が出回るようになりました。このアーキテクチャの場合、TCPでX11 Protocolを書き出しているので、Unix Domain Socketではなく、ポートフォワードで実現するのかなと思います(未確認)

005.png

参考文献

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4