例
$ xpra start --bind-tcp=0.0.0.0:9876 --start='xhost +local:root'
$ docker run --rm -e DISPLAY=:1 -v /tmp/.X11-unix:/tmp/.X11-unix:ro gns3/xeyes
はじめに
サーバに ssh などで接続して、作業することがあるが、GUI アプリををブラウザに追い出して実行することができると便利ではないだろうか?今回は Xpra 上に Docker をつないで追い出してみよう。コンテナごとにセッションを立てると区別しやすい。ただしこの方法はあまりセキュリティ上よろしい方法ではない。
Xpra のインストール
ubuntu では以下の方法でインストールできる。
$ sudo apt install xpra -y
最新版は以下から入手できる。
Xpra 自体はtmux のようにセッションを保存するものだ。接続が切れても計算などを続けることができる。
Docker のインストール
以下のシェルスクリプトを実行する。
#!/bin/bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg -y
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch="$(dpkg --print-architecture)" \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin -y
# To run whitout sudo
sudo gpasswd -a $(whoami) docker
インストールできたら再起動する。
Xpra をブラウザ上で使うには下のようにする。
$ xpra start --bind-tcp=0.0.0.0:9876 --start='xhost +local:root'
Entering daemon mode; any further errors will be reported to:
/run/user/1000/xpra/S41111.log
Actual display used: :1
Actual log file name is now: /run/user/1000/xpra/:1.log
--bind-tcp
はポート番号を指定する。0.0.0.0
はすべてコンピュータからアクセスを受けいるれという意味だ。 9876
の部分に使ってよいポート番号を指定する。--html
オプションはブラウザ上で実行できるかを決める。--start
オプションは実行するコマンドを決める。ディスプレイは :1
が使われていることがわかる。
では、ブラウザで http://<ip>:9876
に接続してみよう。接続状態を見るには下のようにする。
ディスプレイが :1
だとわかるのでこれをつないで、接続してみよう。gns3/xeyes
は xeyes の Image だ。
$ docker run --rm -e DISPLAY=:1 -v /tmp/.X11-unix:/tmp/.X11-unix:ro gns3/xeyes &
Docker で作業が終わったら、Xpra も消しておこう。ディスプレイは :1
だったので、
$ xpra stop :1
便利なオプション
複数のブラウザで同じディスプレイを開ける。
--sharing=yes
ユーザ名と環境変数 XPRA_PASSWORD
に指定したパスワードで認証する。
--tcp-auth=env
参考