LoginSignup
28

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-05-14

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 を利用しているはず?だが、とはいえこんなに遅くなるものなんだろうか。

関連

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
28