Mac
Docker
X11

Docker for Mac で X11 アプリケーションを動かす

Docker for Mac で X11 アプリケーションを動かそうとしたら少しハマったのでメモ。


環境


  • macOS Mojave (10.14)

  • XQuartz 2.7.11 (xorg-server 1.18.4)


手順


0. 動かしたい X11 アプリの Docker イメージを用意する

今回は例として、xeyes が動くイメージを作って xeyes という名前をつけておく。


Dockerfile

FROM alpine

RUN apk --no-cache add xeyes

CMD ["/usr/bin/xeyes"]


$ docker build -t xeyes .


1. ホスト側 (macOS) で X11 サーバ (XQuartz) を起動させておく

環境設定で ネットワーク・クライアントからの接続を許可 にチェックを入れておく必要がある。 接続を認証 はデフォルトでチェックが入っていると思うが、こちらはチェックが入ったままでよい (外すのはセキュアではない)。

また、環境設定の変更は XQuartz を再起動しないと反映されないので注意。

XQuartz Settings


2. 環境変数 DISPLAY と認証情報を共有しつつ、コンテナを起動する

コンテナ起動時にやるべきことは2点。


  • コンテナ側の環境変数 DISPLAY<ホスト名>:0 を指定する

  • ホスト側の ~/.Xauthority をコンテナ側のホームディレクトリにマウントする

$ docker run --rm \

-e DISPLAY=$(hostname):0 \
-v ~/.Xauthority:/root/.Xauthority \
xeyes

xeyes

動いた。


[おまけ] OpenGL アプリを動かす

X11 サーバ側で Indirect GLX を有効にすれば OpenGL アプリも動かせる。

参考: X Window Systemを使ってリモートサーバでOpenGLなプログラムを走らせる方法 - ぼくたち宇宙人

XQuartz で Indirect GLX を有効にするには以下のコマンドを実行する。

$ defaults write org.macosforge.xquartz.X11 enable_iglx -bool true

試しに glxgears を動かしてみる。


Dockerfile

FROM alpine

RUN apk --no-cache add mesa-demos

CMD ["glxgears"]


$ docker build -t glxgears .

$ docker run --rm \

-e DISPLAY=$(hostname):0 \
-v ~/.Xauthority:/root/.Xauthority \
glxgears

glxgears

動いたっちゃ動いたのだけど、めちゃくちゃ遅い。

MacBook には GPU が積まれていないので Intel HD Graphics を利用しているはず?だが、とはいえこんなに遅くなるものなんだろうか。


関連