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 を再起動しないと反映されないので注意。
2. 環境変数 DISPLAY
と認証情報を共有しつつ、コンテナを起動する
コンテナ起動時にやるべきことは2点。
- コンテナ側の環境変数
DISPLAY
に<ホスト名>:0
を指定する - ホスト側の
~/.Xauthority
をコンテナ側のホームディレクトリにマウントする
$ docker run --rm \
-e DISPLAY=$(hostname):0 \
-v ~/.Xauthority:/root/.Xauthority \
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
動いたっちゃ動いたのだけど、めちゃくちゃ遅い。
MacBook には GPU が積まれていないので Intel HD Graphics を利用しているはず?だが、とはいえこんなに遅くなるものなんだろうか。