You may need to deploy desktop applications with Docker but it does not normally provides a display server for running desktop applications. X11 Docker comes to your rescue. It allows running desktop applications and even entire desktop in Docker Linux containers. It runs an X display server on the host system and provides it to Docker containers. It additionally does some security set up which enhance container isolation and avoids X security leaks.
Features of x11 Docker
- Focus on security – X11docker runs additional X servers preventing X security leaks. It restricts container capabilities to bare minimum and ensures that container user is same as host user to avoid using root in the container.
- Less dependencies – It requires Docker installed beside X. There could be optional dependencies depending on the application you are running.
- Support various optional features including printer, sound, webcam and GPU.
- It is possible to remote access through ssh, VNC and html 5
- It is easy to use.
X11docker Supported Systems.
X11docker is fully supported on Linux. It also works on Windows OS but with set up and limitations. It does not run on MacOS.
Installing x11docker on Linux
x11docker simply needs bash, docker and an X server which is most probably already installed in your system. This is normally Xorg or Xwayland. You can install recommended base for your distribution, which are meant to give you advanced usage of x11docker.
Install x11docker dependencies on Debian|Ubuntu|Linux Mint:
sudo apt-get update sudo apt-get -y install xpra xserver-xephyr xinit xauth xclip x11-xserver-utils x11-utils
Install x11docker dependencies on Arch|manjaro Linux:
sudo pacman -S xpra xorg-server-xephyr xorg-xinit xorg-xauth xclip xorg-xhost xorg-xrandr xorg-xdpyinfo
Install x11docker dependencies on Fedora|CentOS:
sudo yum -y xpra xorg-x11-server-xephyr xorg-x11-xinit xorg-x11-xauth xclip xorg-x11-server-utils xorg-x11-utils
To install x11docker for the first time on your Linux system, run the following commands on your terminal.
# If using sudo curl -fsSL https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | sudo bash -s -- --update # If using root curl -fsSL https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | bash -s -- --update
To update and remove x11docker, run the following commands:
x11docker --update: download and install latest release from github.
x11docker --update-master: download and install latest master version from github.
x11docker --remove: remove all files installed by x11docker. However, it does not remove ~/.local/share/x11docker where it stores persistent files of option –home or x11docker folders you might have created for yourself.
Running Desktop applications with x11docker
Once you have installed x11docker, you can available commands to be used with x11docker using –help. Some are as shown below:
$ x11docker --help x11docker: Run GUI applications and desktop environments in Docker containers. Usage: To run a Docker container on a new X server: x11docker IMAGE x11docker [OPTIONS] IMAGE [COMMAND] x11docker [OPTIONS] -- IMAGE [COMMAND [ARG1 ARG2 ...]] x11docker [OPTIONS] -- DOCKER_RUN_OPTIONS -- IMAGE [COMMAND [ARG1 ARG2 ...]] To run a host application on a new X server: x11docker [OPTIONS] --exe COMMAND x11docker [OPTIONS] --exe -- COMMAND [ARG1 ARG2 ...] To run only an empty new X server: x11docker [OPTIONS] --xonly Options: (short options do not accept arguments) --help Display this message and exit. -e, --exe Execute host application instead of docker command. --xonly Only create empty X server. Basic settings: (especially influencing automatical choice of X server) -d, --desktop Indicate desktop environment in image. -g, --gpu GPU access for hardware accelerated OpenGL rendering. Works best with open source drivers on host and in image. For closed source nvidia drivers regard terminal output. -w, --wm [=ARG] Provide a window manager to container applications. If available, image x11docker/openbox will be used. Otherwise x11docker looks for a host window manager. Possible ARG: host: Enforce autodetection of a host window manager. COMMAND: COMMAND can be a desired host window manager. IMAGE: IMAGE can be a local docker image with a WM. none: Run without a window manager. Same as --desktop. Shared host folders or Docker volumes: -m, --home [=ARG] Create a persistant HOME folder for data storage. Default: Uses ~/.local/share/x11docker/IMAGENAME. ARG can be another host folder or a Docker volume. (~/.local/share/x11docker has a softlink to ~/x11docker.) (Use --homebasedir to change this base storage folder.) --share ARG Share host file or folder ARG. Read-only with ARG:ro Device files in /dev can be shared, too. ARG can also be a Docker volume instead of a host folder. Host integration: -c, --clipboard Share clipboard. Graphical clips with --xpra only. -p, --pulseaudio [=MODE] Sound with pulseaudio. Needs 'pulseaudio' on host and in image. Optional arg MODE can be 'socket' or 'tcp'. --alsa [=CARDNAME] Sound with ALSA. You can define a desired sound card with CARDNAME. List of available sound cards: aplay -l -l, --lang [=LOCALE] Set language variable LANG=LOCALE in container. Without LOCALE host variable --lang=$LANG is used. If LOCALE is missing in image, x11docker generates it with 'localedef' in container (needs 'locales' package). LOCALE can be e.g. ru, en, de, zh_CN, cz, fr, fr_BE.
To enable remote access to X server, run the command below on your terminal.
$ xhost + Access control disabled, clients can connect from any host.
You can create dockerfile for running your desktop applications or download images from docker hub. Check example below:
Create a docker file to install Abiword. Use your preferred editor. I am using vim
$ vim Dockerfile
Add the following content
FROM ubuntu RUN apt-get update && apt-get -y install abiword CMD abiword
Create image from the dockerfile with build command
sudo docker build -t abiword .
Run Abiword container with X server
sudo docker run --rm -ti --net=host -e DISPLAY=:0 abiword
The application should open as below and you should able to perform the normal application operations.
The command below should install and run Eclipse application in Docker containers. It is going to pull the image since it is already locally available.
$ sudo docker run --rm -ti --net=host -e DISPLAY=:0 psharkey/eclipse
You should see it pulling eclipse image:
Eclipse application should open with X server and you can carry out normal eclipse operations.
This has been a guide on how to install and use x11docker on Linux to run GUI applications on Docker. This is quite useful especially when running developer applications and you need to run them in containers. I hope the guide is helpful to you. Below are more interesting guides: