x11docker allows to run graphical desktop applications (and entire desktops) in Docker Linux containers.
Software can be installed in a deployable Docker image with a rudimentary Linux system inside. This can help to run or deploy software that is difficult to install on several systems due to dependency issues. It is possible to run outdated versions or latest development versions side by side. Files to work on can be shared between host and container.
x11docker wiki provides some how-to's for basic setups without x11docker.
x11docker runs on Linux and (with some setup and limitations) on MS Windows. x11docker does not run on macOS except in a Linux VM.
nxagent
and Xephyr
.x11docker x11docker/fvwm xterm
x11docker --desktop --size 320x240 x11docker/lxde
(needs nested X server Xephyr
)x11docker-gui
is an optional graphical frontend for x11docker
. It runs from console, too.
x11docker-gui
needs package kaptain
. If your distribution misses it, look at kaptain repository.kaptain
is not installed on your system, x11docker-gui
uses image x11docker/kaptain
.Just type x11docker IMAGENAME [COMMAND]
.
x11docker --help
.
-d, --desktop
.-t, --tty
.-i, --interactive
.docker
command (and further infos) with option --debug
.General syntax:
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
DOCKER_RUN_OPTIONS
are just added to docker run
command without a serious check by x11docker.
Description of some commonly used feature options.
--preset
.If no X server option is specified, x11docker automatically chooses one depending on installed dependencies and on given or missing options --desktop
, --gpu
and --wayland
. Most recommended are nxagent
and Xephyr
.
--xorg
within X.-t, --tty
to run without X at all.x11docker assumes that you want to run a single application in seamless mode, i.e. a single window on your regular desktop. If you want to run a desktop environment in image, add option --desktop
.
--nxagent
and --xpra
. As a fallback insecure option --hostdisplay
is possible.--desktop
is supported with all X server options except --hostdisplay
. If available, x11docker prefers --xephyr
and --nxagent
.--wm
).
nxagent
nor xpra
are installed, but x11docker finds a desktop capable X server like Xephyr
, it avoids insecure option --hostdisplay
and runs Xephyr with a window manager.x11docker/openbox
to run a window manager in its own container.--wm=x11docker/lxde
.--wm=xfwm4
.Changes in a running Docker container system will be lost, the created Docker container will be discarded. For persistent data storage you can share host directories or Docker volumes:
-m, --home
creates a host directory in ~/.local/share/x11docker/IMAGENAME
that is shared with the container and mounted as its HOME
directory.
Files in container home and user configuration changes will persist.
x11docker creates a softlink from ~/.local/share/x11docker
to ~/x11docker
.
HOME
with --home=DIR
.HOME
with --home=VOLUME
.--share PATH
mounts a host file or folder at the same location in container.
--share VOLUME
.--share PATH:ro
restricts to read-only access./dev
are supported, too.$HOME
:
--home=$HOME
will use your host home as container home. Discouraged, use with care.--share $HOME
will symlink your host home as a subfolder of container home.Note that x11docker copies files from /etc/skel
in container to HOME
if HOME
is empty. That allows to provide predefined user configurations in the image.
Hardware acceleration for OpenGL is possible with option -g, --gpu
.
Clipboard sharing is possible with option -c, --clipboard
.
--xpra
and --hostdisplay
.xclip
on host.Sound is possible with options -p, --pulseaudio
and --alsa
.
--pulseaudio
you need pulseaudio
on host and pulseaudio
(at least the pulseaudio
client libraries) in image.
Compare wiki: feature dependencies.--alsa
you might need to specify a sound card with e.g. --alsa=Generic
. Get a list of available sound cards with aplay -l
.Webcams on host can be shared with option --webcam
.
--gpu
dependencies in image.
Compare wiki: feature dependencies.guvcview
needs --pulseaudio
or --alsa
.cheese
and gnome-ring
need --init=systemd
.Printers on host can be provided to container with option --printer
.
cups
on host, the default printer server for most linux distributions.cups
client libraries in image.
Compare wiki: feature dependencies.x11docker provides option --lang
for flexible language locale settings.
--lang
without an argument sets LANG
in container to same as on host. Same as --lang=$LANG
locale
packages in image.
Compare wiki: feature dependencies.--lang=de
for German, --lang=zh_CN
for Chinese, --lang=ru
for Russian, --lang=$LANG
for your host locale.fonts-arphic-uming
in image.fcitx-pinyin
are possible with some container setup. Compare ticket #269.To run Wayland instead of an X server x11docker provides options --wayland
, --weston
, --kwin
and --hostwayland
.
For further description loot at wiki: Description of Wayland options.
--wayland
automatically sets up a Wayland environment. It regards option --desktop
.--weston
and --kwin
run Wayland compositors weston
or kwin_wayland
.--hostwayland
can run applications seamless on host Wayland desktops like Gnome 3, KDE 5 and Sway.xfce4-terminal
on Wayland: x11docker --wayland x11docker/xfce xfce4-terminal
x11docker supports several init systems as PID 1 in container with option --init
. Init in container solves the zombie reaping issue.
As default x11docker uses tini
in/usr/bin/docker-init
. Also available are systemd
, SysVinit
, runit
, OpenRC
and s6-overlay
. elogind
is supported, too.
Look at wiki: Init systems in Docker.
Some desktop environments and applications need a running DBus system daemon and/or DBus user session. DBus options need dbus
in image.
--dbus
to run a DBus user session daemon.systemd
, openrc
, runit
and sysvinit
(option --init
).
--dbus=system
without advanced init systems. However, this causes trouble in some cases and is not recommended in general.--hostdbus
to connect to host DBus user session.--share /run/dbus/system_bus_socket
to share host DBus system socket.It is possible to run containers with different backends following the OCI runtime specification. Docker's default runtime is runc
. You can specify another one with option --runtime=RUNTIME
.
Container runtimes known and supported by x11docker are:
runc
: Docker default.kata-runtime
: Sets up a virtual machine with its own Linux kernel to run the container. kata
aims to combine the security advantages of containers and virtual machines.
--runtime=kata-runtime
. Most important: --hostdisplay
, --gpu
, --printer
, --webcam
and all Wayland related options.nvidia
: Specialized fork of runc
to support nvidia/nvidia-docker
images.crun
: Fast and lightweight alternative to runc
with same functionality.oci
: Runtime reported in #205, no documentation found. Handled by x11docker like runc
.Possible runtime configuration in /etc/docker/daemon.json
:
{
"default-runtime": "runc",
"runtimes": {
"kata-runtime": {
"path": "/opt/kata/bin/kata-runtime",
"runtimeArgs": [
"--kata-config /opt/kata/share/defaults/kata-containers/configuration.toml"
]
},
"crun": {
"path": "/usr/local/bin/crun",
"runtimeArgs": []
},
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
Scope of x11docker is to run containerized GUI applications while preserving and improving container isolation. Core concept is:
--hostdisplay
).~/.Xauthority
.--user=USERNAME
or a non-existing one with --user=UID:GID
./etc/sudoers
.
--sudouser
that allows su
and sudo
with password x11docker
. Alternatively you can run with --user=root
.USER
specified in image instead, set option --user=RETAIN
. x11docker won't change container's /etc/passwd
or /etc/sudoers
in that case. Option --home
won't be available.--cap-drop=ALL
to drop all capabilities. Most applications don't need them.--security-opt=no-new-privileges
.--cap-default
or reduced with --sudouser
, --user=root
, --newprivileges
.That being said, Docker's default capabilities and its seccomp profile are not bad. I am not aware of an escape from a container without an additional isolation degrading option or configuration. However, x11docker follows the principle of least privilege. Docker containers should not have capabilities or privileges that they don't need for their job.
Docker's default runtime runc
uses Linux namespaces to isolate container applications, but shares the kernel from host.
If you are concerned about container access to host kernel, consider to use container runtime kata-runtime
instead.
Weaknesses:
--security-opt label=type:container_runtime_t
to allow access to new X unix socket.
A more restrictive solution is desirable.
Compare: SELinux and Docker: allow access to X unix socket in /tmp/.X11-unix
--home
and --share
without file ownership issues.
--user=RETAIN
.x11docker shows warning messages in terminal if chosen options degrade container isolation. Note that x11docker does not check custom DOCKER_RUN_OPTIONS
.
Most important:
--hostdisplay
shares host X socket of display :0 instead of running a second X server.
--gpu
or --clipboard
, option --hostipc
and trusted cookies are enabled and no protection against X security leaks is left.x11docker --hostdisplay --gpu
is an insecure but quite fast setup without any overhead.--gpu
allows access to GPU hardware. This can be abused to get window content from host (palinopsia bug) and makes GPU rootkits like keyloggers possible.--pulseaudio
and --alsa
allow catching audio output and microphone input from host.Rather special options reducing security, but not needed for regular use:
--sudouser
and --user=root
allow su
and sudo
with password x11docker
for container user.
If an application somehow breaks out of container, it can harm your host system. Allows many container capabilties that x11docker would drop otherwise.--cap-default
disables x11docker's container security hardening and falls back to default Docker container capabilities.
If an application somehow breaks out of container, it can harm your host system.--init=systemd|sysvinit|openrc|runit
allow some container capabilities that x11docker would drop otherwise.
--init=systemd
also shares access to /sys/fs/cgroup
. Some processes will run as root in container.
If a root process somehow breaks out of container, it can harm your host system. Allows many container capabilties that x11docker would drop otherwise.--hostipc
sets docker run option --ipc=host
. Allows MIT-SHM / shared memory. Disables IPC namespacing.--hostnet
sets docker run option --network=host
. Shares host network stack. Disables network namespacing. Container can spy on and maybe manipulate host network traffic.--hostdbus
allows communication over DBus with host applications.Container isolation enhanced with x11docker allows to use containers as a sandbox that fairly well protects the host system from possibly malicious or buggy software. Though, no sandbox solution in the wild can provide a perfect secure protection, and Docker even with enhanced security settings from x11docker is no exception.
Using Docker with x11docker as a sandbox is not intended to run obviously evil software. Rather use it as:
javascript
, or wine
with MS Windows applications.x11docker already restricts process capabilities. You can additionally restrict access to CPU and RAM with option --limit
.
As default --limit
restricts to 50% of available CPUs and 50% of currently free RAM. Another amount can be specified with --limit=FACTOR
with a FACTOR
greater than zero and less than or equal one.
For more custom fine tuning have a look at Docker documentation: Limit a container's resources.
NOTE: Internet access is allowed by default. You can disable internet access with --no-internet
.
WARNING: There is no restriction that can prevent the container from flooding the hard disk in Docker's container partition or in shared folders.
To check container isolation and some feature options use image x11docker/check
and try out with several options.
x11docker --hostdisplay --gpu x11docker/check
. It fairly well demonstrates common X security leaks.--pulseaudio --alsa --webcam --clipboard --printer
to check their functionality.Note that x11docker is just a bash script without library dependencies. Basically it is just a wrapper for X servers and Docker. To allow advanced usage of x11docker abilities have a look at chapter Dependencies.
As root you can install, update and remove x11docker in system directories to be available system-wide:
x11docker --install
: install x11docker and x11docker-gui from current directory. (Useful to install from an extracted zip
file or a cloned git
repository.)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.
~/.local/share/x11docker
where it stores persistent files of option --home
.Copies x11docker
and x11docker-gui
to /usr/bin
. Creates an icon in /usr/share/icons
.
Creates x11docker.desktop
in /usr/share/applications
. Copies README.md
, CHANGELOG.md
and LICENSE.txt
to /usr/share/doc/x11docker
.
sudo
:
curl -fsSL https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | sudo bash -s -- --update
root
:
curl -fsSL https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | bash -s -- --update
You can run x11docker from an arbitray location with bash x11docker
.
For minimal system-wide installation make x11docker
executable with chmod +x x11docker
and move it to /usr/bin
(or another location in PATH
).
Other files than script x11docker
itself are not essential.
x11docker can run natively on MS Windows electively in one of:
Further informations at wiki: x11docker on MS Windows.
You can remove x11docker with x11docker --remove
. That will remove the files listed above.
It will also remove ~/.cache/x11docker
and stop all running x11docker containers.
x11docker will not remove:
--home
. These are:
~/.local/share/x11docker
where persistant data is stored.~/x11docker
that points there.~/.local/share/x11docker
~/.config/x11docker
x11docker can run with standard system utilities without additional dependencies on host or in image.
bash
, an X
server and docker
to run Docker containers on X.For advanced usage of x11docker it is recommended to install some additional packages.
The recommended base commands are: nxagent
Xephyr
weston
Xwayland
xdotool
xauth
xinit
xclip
xhost
xrandr
xdpyinfo
. Some of them are probably already installed.
Some feature options have additional dependencies on host and/or in image. This affects especially options --gpu
, --printer
and --pulseaudio
.
Compare wiki: feature dependencies.
For troubleshooting run x11docker
or x11docker-gui
in a terminal.
x11docker shows warnings if something is insecure, missing or going wrong.
Also it shows notes if options don't work and fallbacks are used.
It might give hints to fix some issues.
1. Make sure your x11docker version is up to date with x11docker --update
(latest release) or x11docker --update-master
(latest beta).
2. Carefully read the regular x11docker messages. Often they already give a hint what to do.
-D, --debug
to see some internal messages.-v, --verbose
to see full logfile output.~/.cache/x11docker/x11docker.log
.3. Try another X server option.
--hostdisplay
. Add --clipboard
to disable some security restrictions of --hostdisplay
.--xephyr
.Some applications need more privileges or capabilities than x11docker provides by default.
One attempt is to allow several privileges until the setup works. Than reduce privileges to find out which are needed indeed.
(Note the --
in the following commands, do not miss them).
1. Adding privileges:
x11docker --cap-default IMAGENAME
x11docker --cap-default --hostipc --hostnet IMAGENAME
x11docker --cap-default --hostipc --hostnet --share /run/udev/data:ro -- --cap-add ALL --security-opt seccomp=unconfined --privileged -- IMAGENAME
2. Reducing privileges:
--privileged --security-opt seccomp=unconfined --cap-add ALL --share /run/udev/data:ro --hostnet --hostipc --cap-default
. Only leave options that are needed to keep the setup working.--cap-default
might already be enough. It allows default container capabilities as Docker would do on itself.
--cap-default
. Partially remove addional options to find out which one(s) are needed:
x11docker --newprivileges -- IMAGENAME
x11docker --newprivileges -- --cap-add=SETPCAP --cap-add=MKNOD --cap-add=AUDIT_WRITE --cap-add=CHOWN --cap-add=NET_RAW --cap-add=DAC_OVERRIDE --cap-add=FOWNER --cap-add=FSETID --cap-add=KILL --cap-add=SETGID --cap-add=SETUID --cap-add=NEW_BIND_SERVICE --cap-add=SYS_CHROOT --cap-add=SETFCAP -- IMAGENAME
--cap-add ALL
should not be considered to be a solution.
x11docker --cap-default -- --cap-add=SYS_MODULE --cap-add=SYS_RAWIO --cap-add=SYS_PACCT --cap-add=SYS_ADMIN --cap-add=SYS_NICE --cap-add=SYS_RESOURCE --cap-add=SYS_TIME --cap-add=SYS_TTY_CONFIG --cap-add=AUDIT_CONTROL --cap-add=MAC_OVERRIDE --cap-add=MAC_ADMIN --cap-add=NET_ADMIN --cap-add=SYSLOG --cap-add=DAC_READ_SEARCH --cap-add=LINUX_IMMUTABLE --cap-add=NET_BROADCAST --cap-add=IPC_LOCK --cap-add=IPC_OWNER --cap-add=SYS_PTRACE --cap-add=SYS_BOOT --cap-add=LEASE --cap-add=WAKE_ALARM --cap-add=BLOCK_SUSPEND --cap-add=AUDIT_READ -- IMAGENAME
SYS_ADMIN
.--privileged
should not be considered to be a solution. Basically it allows arbitrary access to the host for container applications.
/dev
, e.g. something like --share /dev/vboxdrv
.--hostipc
and --hostnet
severly reduce container isolation. Better solutions are desireable.3. Open a ticket to ask for possibilities how to optimize the privilege setup.
1. Container user: By default x11docker sets up an unprivileged container user similar to your host user.
USER
specification and be designed for this user.
USER
specification in image with docker inspect --format '{{.Config.User}}' IMAGENAME
--user=RETAIN
--user=root
. Note that this disables some x11docker restrictions for containers similar to --cap-default
.2. Init and DBus
dbus
in image and try option --dbus
.systemd
in image and try option --init=systemd
.3. Architecture check of host OS and image
dockerrc(): Did not receive PID of PID1 in container.
docker inspect --format {{.Architecture}} IMAGENAME
.uname -m
.Feel free to open a ticket if you have a question or encounter an issue.
If reporting an issue:
--verbose
output (or ~/.cache/x11docker/x11docker.log
) at pastebin.com.If you want to contribute to x11docker, please open a ticket before creating a pull request. Often it is possible to accomplish desired tasks with already available options. Note that x11docker is considered to be stable and changes other than bug fixes are less likely to be merged. In general new features are not intended.
Please open a ticket if you need support. Please note that x11docker
is a non-commercial project maintained in free time.
I'll help where I can, but there is no organisation behind x11docker
that can provide large scale support.
If you like to make a donation: Thank you! :)
I don't take the money myself, but please spend some to Galsan Tschinag in Mongolia (Wikipedia). One of his great projects is the afforestation of Mongolia. A donation account in Germany is provided by Förderverein Mongolei e.V..
Förderverein Mongolei e.V.
IBAN DE7261290120 0394 3660 00
BIC GENODES1NUE
Volksbank Kirchheim-Nürtingen
I personally know some of the people behind this. I assure that they are trustworthy and have a great heart and soul and do a good thing.
x11docker image examples with desktop environments can be found on docker hub.
A special one to check features and container isolation is x11docker/check
.
Application | x11docker command |
---|---|
Xfce4 Terminal | x11docker x11docker/xfce xfce4-terminal |
GLXgears with hardware acceleration | x11docker --gpu x11docker/xfce glxgears |
Kodi media center with hardware acceleration, Pulseaudio sound and shared Videos folder. For setup look at ehough/docker-kodi. |
x11docker --gpu --pulseaudio --share ~/Videos erichough/kodi . |
XaoS fractal generator | x11docker patricknw/xaos |
Telegram messenger with persistent HOME for configuration storage |
x11docker --home xorilog/telegram |
Firefox with shared Download folder. |
x11docker --share $HOME/Downloads -- --tmpfs /dev/shm -- jess/firefox |
Tor browser | x11docker jess/tor-browser |
Chromium browser | x11docker -- jess/chromium --no-sandbox |
VLC media player with shared Videos folder and Pulseaudio sound |
x11docker --pulseaudio --share=$HOME/Videos jess/vlc |
GNU Octave Scientific Programming Language built for arm & arm64 | x11docker aptman/dbhi:bionic-octave octave |
Desktop environment (most based on Debian) |
x11docker command |
---|---|
Cinnamon | x11docker --desktop --gpu --init=systemd x11docker/cinnamon |
deepin (website) (3D desktop from China) | x11docker --desktop --gpu --init=systemd -- --cap-add=IPC_LOCK --security-opt seccomp=unconfined -- x11docker/deepin |
Enlightenment (based on Void Linux) | x11docker --desktop --gpu --runit x11docker/enlightenment |
Fluxbox (based on Debian, 87 MB) | x11docker --desktop x11docker/fluxbox |
FVWM (based on Alpine, 22.5 MB) | x11docker --desktop x11docker/fvwm |
Gnome 3 | x11docker --desktop --gpu --init=systemd x11docker/gnome |
KDE Plasma | x11docker --desktop --gpu --init=systemd x11docker/kde-plasma |
KDE Plasma as nested Wayland compositor | x11docker --gpu --init=systemd -- --cap-add SYS_RESOURCE -- x11docker/kde-plasma startplasmacompositor |
Lumina (website) (based on Void Linux) | x11docker --desktop x11docker/lumina |
LiriOS (needs at least docker 18.06 or this xcb bugfix.) (based on Fedora) |
x11docker --desktop --gpu lirios/unstable |
LXDE | x11docker --desktop x11docker/lxde |
LXDE with wine and PlayOnLinux and a persistent HOME folder to preserve installed Windows applications, and with Pulseaudio sound. |
x11docker --desktop --home --pulseaudio x11docker/lxde-wine |
LXQt | x11docker --desktop x11docker/lxqt |
Mate | x11docker --desktop x11docker/mate |
Trinity (website) (successor of KDE 3) | x11docker --desktop x11docker/trinity |
Xfce | x11docker --desktop x11docker/xfce |
For very long option combinations you might want to use option --preset FILENAME
to have a command shortcut.
FILENAME
is a file in ~/.config/x11docker/preset
containing some x11docker options.
~/.config/x11docker/preset/multimedia
:
--gpu
--webcam
--printer
--pulseaudio
--clipboard
--share ~/Videos
--share ~/Music
Use it like: x11docker --preset=multimedia jess/vlc
x11docker --desktop --init=systemd -- --cap-add=IPC_LOCK --security-opt seccomp=unconfined -- x11docker/deepin
you can create a file ~/.config/x11docker/preset/deepin
containing the desired options:
--desktop
--init=systemd
--
--cap-add=IPC_LOCK
--security-opt seccomp=unconfined
--
x11docker/deepin
Run with: x11docker --preset=deepin
For persistent changes of image system adjust Dockerfile and rebuild. To add custom applications to x11docker example images you can create a new Dockerfile based on them. Example:
# xfce desktop with VLC media player
FROM x11docker/xfce
RUN apt-get update && apt-get install -y vlc
More screenshots are stored in screenshot branch
x11docker --desktop x11docker/lxde-wine
x11docker --desktop x11docker/lxqt
x11docker --desktop --gpu --init=systemd -- --cap-add=IPC_LOCK --security-opt seccomp=unconfined -- x11docker/deepin