LoginSignup
7
2

More than 3 years have passed since last update.

macOS上でX11アプリを起動する(Docker + Xvfb + VNC)

Posted at

connected.png

1. 概要

 macOS上でX11環境を必要とするアプリを実行したいこと、たまにありませんか?僕はあります。
macOS上のX11環境(XQuartz)を利用するのも1つの手ですが、もっと手軽に使えないかと、Docker、Xvfb、VNCを組み合わせる方法を試してみました。
まだ詳細な検証は行っていませんが、問題なく利用できそうです。

2. 使用するソフトウェア

 今回使用したソフトウェアは以下の通りです。

  • Docker
  • Xvfb: X virtual framebuffer
    • 仮想的なフレームバッファ(描画先)を持つディスプレイサーバです。X11プロトコルをサポートしており、実際のディスプレイ環境とは独立したフレームバッファを作ることができます。
    • 英語版Wikipedia: https://en.wikipedia.org/wiki/Xvfb
  • VNC: Virtual Network Computing

3. 環境

 今回試した環境は以下の通りです。

  • ホスト:
    • OS: macOS Mojave 10.14.5
    • Docker Desktop for Mac: 2.1.0.1 (37199)
      • Docker Engine: 19.03.1
    • TigerVNC Viewer: 1.9.0
  • コンテナ:
    • OS: Ubuntu 18.04.3 LTS
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132

$ docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:18:17 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:17:52 2019
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

$ docker image pull ubuntu:18.04
18.04: Pulling from library/ubuntu
Digest: sha256:d1d454df0f579c6be4d8161d227462d69e163a8ff9d20a847533989cf0c94d90
Status: Image is up to date for ubuntu:18.04
docker.io/library/ubuntu:18.04

$ docker container run --tty --rm ubuntu:18.04 cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

4. xeyesを実行してみる

 シンプルなX11アプリとして目玉が表示されるxeyesコマンドを実行してみます。
なお、host$はホストマシン、docker$はDockerコンテナ内での実行をそれぞれ示します。

4.1. 事前準備

 Dockerコンテナを起動し、必要なUbuntuパッケージをインストールします。なお、xeyesx11-appsに含まれています。

host$ docker container run --interactive --tty --rm --publish 5900:5900 ubuntu:18.04 /bin/bash

docker$ apt-get update
docker$ DEBIAN_FRONTEND=noninteractive apt-get install --yes --no-install-recommends xvfb x11vnc x11-apps
docker$ dpkg -l | grep -E "(xvfb|x11vnc|x11-apps)"
ii  x11-apps                   7.7+6ubuntu1             amd64        X applications
ii  x11vnc                     0.9.13-3                 amd64        VNC server to allow remote access to an existing X session
ii  x11vnc-data                0.9.13-3                 all          data files for x11vnc
ii  xvfb                       2:1.19.6-1ubuntu4.3      amd64        Virtual Framebuffer 'fake' X server

4.2. xeyesの起動

 xvfb-runコマンド経由でxeyesを実行します。
xvfb-runはデフォルトではディスプレイ番号:99で仮想ディスプレイを作成します。
また、デフォルトではPIDを含んだランダムな認証用ファイルを生成しますが、ここでは/tmp/xvfb-runに固定しています。

docker$ xvfb-run --auth-file /tmp/xvfb-run -- xeyes &

4.3. VNCサーバの起動

 作成した仮想ディスプレイにアクセスするためのVNCサーバを起動します。
今回はVNCサーバの1つであるx11vncを使用しました。

docker$ x11vnc -display :99 -auth /tmp/xvfb-run

4.4. VNCクライアントからアクセス

 起動したVNCサーバにVNCクライアント(ビューア)で接続します。今回はVNCクライアントの1つである「TigerVNC Viewer v1.9.0」を使用しました。
x11vnc5900/tcpで接続を待機しています。
また、docker container run--publishオプションでポートを転送しているため、localhostに対して接続を行います。

connection.png

 無事に接続でき、マウスカーソルの位置に応じて目玉が動くことを確認しました。

connected.png

5. 発展

 今回は単一のX11アプリを起動しましたが、Fluxboxなどウィンドウマネージャを起動することで、デスクトップ環境を実現することもできると思います。(試していません)

 また、Xの仮想ディスプレイはFFmpegで動画を撮影することもできるので、動画でテストの証憑(エビデンス)を記録するといった用途にも使えそうです。夢が広がりますね!

6. 参考

7
2
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
2