Skip to content

Instantly share code, notes, and snippets.

@josh0yeh
Last active November 23, 2021 10:07
Show Gist options
  • Save josh0yeh/48e5d9ac3b330c70eaa25801aa69a809 to your computer and use it in GitHub Desktop.
Save josh0yeh/48e5d9ac3b330c70eaa25801aa69a809 to your computer and use it in GitHub Desktop.

Getting X11 GUI applications to work on OS X with Docker

Install depedent packages via Brew (one-time setup)

$ brew install socat
$ brew cask install xquartz

Setup XQuartz

# optionally, stop xQuartz opening XTerm (I find this behavior annoying)
$ defaults write org.macosforge.xquartz.X11 nolisten_tcp 0
$ defaults write org.macosforge.xquartz.X11 app_to_run /usr/bin/true

4077d680-b18e-11eb-8550-088a0fdb966e (1)

Setup environment

# setup using docker backed by virtualbox via DOCKER_HOST
$ eval $(docker-machine env) ; docker-machine ip

# start XQuartz session
$ open -a XQuartz

# Port forward x11 app (inside docker) request to XQuartz (on macos host)
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

Using X11 App

$ docker run --rm -e DISPLAY=$(docker-machine ip):0 [image] [command]

$ export DISPLAY=192.168.99.1:0   # <-- YMMV, default for docker-machine with virtualbox deployment

# chrome (testing secure CSA cluster, modified /etc/krb5.conf)
$ docker run \
  --rm \
  --name chrome \
  --net host \
  --volume "${HOME}/Downloads:/root/Downloads" \
  --volume "${HOME}/.config/google-chrome/:/data" \
  --security-opt seccomp:unconfined \
  --env "DISPLAY=192.168.99.1:0" \
  jess/chrome -- bash

# firefox (testing secure CSA cluster, modified /etc/krb5.conf)
$ docker run -ti -e DISPLAY=192.168.99.1:0 jess/firefox

# intellij (professional features?)
$ docker run --rm \
  -e DISPLAY=${DISPLAY} \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v ~/.Idea:/home/developer/.Idea \
  -v ~/.Idea.java:/home/developer/.java \
  -v ~/.Idea.maven:/home/developer/.m2 \
  -v ~/.Idea.gradle:/home/developer/.gradle \
  -v ~/.Idea.share:/home/developer/.local/share/JetBrains \
  -v ~/Project:/home/developer/Project \
  --name idea-$(date +'%Y%m%d-%H%M%S') \
  rycus86/intellij-idea-pro:latest

# pycharm
$ docker run --rm \
  -e DISPLAY=${DISPLAY} \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v ~/.PyCharm:/home/developer/.PyCharm \
  -v ~/.PyCharm.java:/home/developer/.java \
  -v ~/.PyCharm.py2:/usr/local/lib/python2.7 \
  -v ~/.PyCharm.py3:/usr/local/lib/python3.7 \
  -v ~/.PyCharm.share:/home/developer/.local/share/JetBrains \
  -v ~/Project:/home/developer/Project \
  --name pycharm-$(date +'%Y%m%d-%H%M%S') \
  rycus86/pycharm-pro:latest

$ docker run --rm -e DISPLAY=192.168.99.1:0 davechick/arduino-dev arduino

See moby/moby#8710 for more info

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment