最近、LinuxのノートPC上でDockerのサーバを建てて生活しています。 そのノートPC上では、プログラミング・ブラウジング・ツイッター・Slack・VTuber動画を見たりといった、あらゆることをしています。これらのことをするためにはGUI環境が必要で、そのためにXサーバを"直接"動かしています。

アーキテクチャはこんな感じです:

ここではこの環境の構築手順について解説していきます。

0. ホスト環境

Ubuntu Server 16.04.3 LTS (64bit)

1
2
3
4
5
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.3 LTS"

1. XサーバとXクライアントの入ったコンテナの作成

Dockerfile:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
FROM ubuntu:16.04
MAINTAINER kunst1080 kontrapunkt1080@gmail.com

RUN apt-get update \
        && DEBIAN_FRONTEND=noninteractive apt-get upgrade -y \
        && DEBIAN_FRONTEND=noninteractive apt-get install -y \
            dbus \
            dbus-x11 \
            xorg \
            xserver-xorg-legacy \
            xinit \
            xterm \
    && rm -rf /var/lib/apt/lists/*

RUN sed -i "s/allowed_users=console/allowed_users=anybody/;$ a needs_root_rights=yes" /etc/X11/Xwrapper.config

ARG user=user
ARG uid=1000
RUN useradd ${user} -u $uid -m -G adm,dialout,cdrom,sudo,audio,dip,video,plugdev,netdev -s /bin/bash

CMD [ "/usr/bin/startx", "--", "vt7" ]
  • 「xserver-xorg-legacy」は一般ユーザで startx するために必要です
  • sed で「/etc/X11/Xwrapper.config」を編集していますが、これも一般ユーザで startx するために必要な設定です

2. コンテナの起動方法

1
2
3
4
5
6
$ docker run --rm --privileged \
    --shm-size=8gb \
    -v /run/udev:/run/udev \
    -v /run/dbus:/run/dbus \
    -v /run/systemd:/run/systemd \
    $IMAGE
  • --privileged オプションは、GUIを表示するために必要(特権コンテナ)
  • /run/udev はマウスとキーボードを使用するために必要
  • /run/dbus/run/systemd は Systemd を使うために必要。Systemd を使用しなければこれらのオプションは不要
  • --shm-size オプションは共有メモリのサイズを指定します。Google Chrome などのアプリケーションを使用するときはこのオプションは必須。(初期値はたったの64MB)

3. 実際の設定

上記の1と2は解説用に必要なエッセンスを取り出した内容です。 私が実際に使っている設定は以下のリポジトリにあります。

  • docker-x11-base: Xサーバ、Xクライアント、よく使う各種ツール・ライブラリ
  • docker-x11-wm: docker-x11-base + window manager
  • docker-desktop: docker-x11-wm + アプリケーションいろいろ(Googl ChromeとかVSCodeとか)

必要に応じてアップデートしていますが、だいたいこんな感じでやって〼

補足 (2018/03/19 追記)

「なぜあえてこんな変なことをやっているのか?」という問いについては以下のスライドで触れているので、併せてご覧ください。

www.slideshare.net

参考URL

※この記事の英語版

Running X server via Docker