How to run a Linux GUI application on OSX using Docker

You just got a nice new MacBook 15" Retina computer thinking it would work as nicely for Linux as your 13" MacBook did and then you discover that the hybrid Intel/Nvidia card support in Linux is a show stopper and the WebCam does not work under Linux.

Well that is what happened to me, so I decided to give working with OSX a try on this laptop with the help of docker for running all those essential apps that I use for development. One thing I was curious about was whether it would be possible to run native GUI (X11) applications from inside docker and have them show up on my OSX desktop. I turns out that it is fairly easy to do this - here is what I did:

Overview

Install brew

Install socat

Install XQuartz

Install Docker (I used Kitematic beta)

Grab a docker image that has a gui app you want to run (I used my the QGIS Desktop image published by Kartoza on the docker hub)

Unfortunately docker does not run natively on OSX, and the whole boot2docker setup is probably quite difficult to explain to people. However there is a very nice (currently beta) docker client being developed for OSX called kinematic. I installed kinematic and then simply hit shift-command-t in order to get a bash shell with docker available in it.

Now grab my QGIS desktop image for docker:

docker pull kartoza/qgis-desktop

Once the image is downloaded we are done with the basic setup and can kick over to running our Linux GUI application (obviously QGIS in this example).

Running QGIS

Ok so there are four steps we need to do to run our Linux app:

Start socat (in my testing it had to be done first)

Start XQuartz

Start Kinematic

Start QGIS

I started socat like this:

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

It will run in the foreground waiting for connections and then pass them over to XQuartz.

Next I started XQuartz (you can close the XTerm window that opens by default). In X11 preferences in XQuartz, in the security tab, check both boxes:

Next I started kinematic, and pressed SHIFT-COMMAND-T to open a docker terminal.

You can mix in any standard docker options there - in this case I created shared volume between my OSX home directory and a /home/timlinux directory in the container. You need to determine the IP address of your OSX machine and use it instead of the IP address listed after DISPLAY in the above command. Here is a nice picture of QGIS (from a Linux container) running on my OSX desktop:

This same technique should work nicely with any other GUI application under Linux - I will mostly use if for running tests of QGIS based plugins and for using QGIS in my docker orchestrated environments.