’Docker + Dcoker-compose’でGUIをMacのディスプレイに表示する方法

docker

概要

Dockerでjavaのイメージを作成して教材などに記載されているプログラムを動かしていると、AWTを使用したGUIのプログラムがでてくるので、X11をmac側から起動して、Dockerと「ソケット」を共有することで通信を行う方法のメモ

前提条件

・brewがインストール済みであること

XQuartzをインストール

brew install XQuartz

XQuartzを起動

下記のコマンドを実行すると、XQuartzというGUIアプリが,ホスト側Macに表示されます。
Docにあるアイコンから環境設定->セキュリティをクリックして、「ネットワーク・クライアントからの接続を許可」をクリック

open -a XQuartz

Macからログアウト

設定を保存したあと、一度Macからログアウトしてログインしなおす。
ログイン後、環境変数$DISPLAYに値が入っていることを確認。

❯ echo $DISPLAY
/private/tmp/com.apple.launchd.xxKvBuaLGT/org.xquartz:0

ホスト側のIPアドレスを登録

$ xhost + localhost                                            
localhost being added to access control list

xhostの許可設定は、下記のコマンドで確認できる

$ xhost            
access control enabled, only authorized clients can connect
INET6:localhost
INET:localhost

※設定をリセットしたい場合は、XQuartzを終了させる。

Dockerfileを編集

イメージには’X Window System’がインストールされていないので、入れる。

FROM openjdk:11

RUN apt-get update

RUN apt-get install -y xserver-xorg

WORKDIR /usr/src

docker-compose.ymlを編集

  1. ホスト側の’/tmp/.X11-unix’を、docker側の’/tmp/.X11-unix’にマウントする
  2. 環境変数DISPLAYをセットする。
version: '3.6'
services:
  java:
    build: ./docker/java
    ports:
      - 8080:8080
    tty: true
    volumes:
      - ./:/usr/src:cached
      - /tmp/.X11-unix:/tmp/.X11-unix
    environment:
      - DISPLAY=host.docker.internal:0

“host.docker.internal” とはDockerDesktopで用意されている、コンテナからローカル環境を参照する際のホスト名です。

参考URL

コメント

タイトルとURLをコピーしました