18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

wslのDockerでGUI操作

Last updated at Posted at 2023-02-22

導入

(🦕は私です)
🦕「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つの実行を確認しました。
なお、 PyAutoGUIVLC注意が必要です。

  • 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
18
22
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
18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?