Can you run GUI applications in a Linux Docker container? Can you run GUI applications in a Linux Docker container? docker docker

Can you run GUI applications in a Linux Docker container?


You can simply install a vncserver along with Firefox :)

I pushed an image, vnc/firefox, here: docker pull creack/firefox-vnc

The image has been made with this Dockerfile:

# Firefox over VNC## VERSION               0.1# DOCKER-VERSION        0.2FROM    ubuntu:12.04# Make sure the package repository is up to dateRUN     echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.listRUN     apt-get update# Install vnc, xvfb in order to create a 'fake' display and firefoxRUN     apt-get install -y x11vnc xvfb firefoxRUN     mkdir ~/.vnc# Setup a passwordRUN     x11vnc -storepasswd 1234 ~/.vnc/passwd# Autostart firefox (might not be the best way to do it, but it does the trick)RUN     bash -c 'echo "firefox" >> /.bashrc'

This will create a Docker container running VNC with the password 1234:

For Docker version 18 or newer:

docker run -p 5900:5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

For Docker version 1.3 or newer:

docker run -p 5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

For Docker before version 1.3:

docker run -p 5900 creack/firefox-vnc x11vnc -forever -usepw -create


Xauthority becomes an issue with newer systems. I can either discard any protection with xhost + before running my docker containers, or I can pass in a well prepared Xauthority file. Typical Xauthority files are hostname specific. With docker, each container can have a different host name (set with docker run -h), but even setting the hostname of the container identical to the host system did not help in my case. xeyes (I like this example) simply would ignore the magic cookie and pass no credentials to the server. Hence we get an error message 'No protocol specified Cannot open display'

The Xauthority file can be written in a way so that the hostname does not matter.We need to set the Authentication Family to 'FamilyWild'. I am not sure, if xauth has a proper command line for this, so here is an example that combines xauth and sed to do that. We need to change the first 16 bits of the nlist output. The value of FamilyWild is 65535 or 0xffff.

docker build -t xeyes - << __EOF__FROM debianRUN apt-get updateRUN apt-get install -qqy x11-appsENV DISPLAY :0CMD xeyes__EOF__XSOCK=/tmp/.X11-unixXAUTH=/tmp/.docker.xauthxauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -docker run -ti -v $XSOCK:$XSOCK -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH xeyes


I just found this blog entry and want to share it here with you because I think it is the best way to do it and it is so easy.

http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

PROS:
+ no x server stuff in the docker container
+ no vnc client/server needed
+ no ssh with x forwarding
+ much smaller docker containers

CONS:
- using x on the host (not meant for secure-sandboxing)

in case the link will fail someday I have put the most important part here:
dockerfile:

FROM ubuntu:14.04RUN apt-get update && apt-get install -y firefox# Replace 1000 with your user / group idRUN export uid=1000 gid=1000 && \    mkdir -p /home/developer && \    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \    echo "developer:x:${uid}:" >> /etc/group && \    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \    chmod 0440 /etc/sudoers.d/developer && \    chown ${uid}:${gid} -R /home/developerUSER developerENV HOME /home/developerCMD /usr/bin/firefox

build the image:

docker build -t firefox .

and the run command:

docker run -ti --rm \   -e DISPLAY=$DISPLAY \   -v /tmp/.X11-unix:/tmp/.X11-unix \   firefox

of course you can also do this in the run command with sh -c "echo script-here"

HINT: for audio take a look at: https://stackoverflow.com/a/28985715/2835523