Doing terrible things with Docker

The Docker philosophy is such that each container should be ephemeral, have a single concern, and contain the absolute minimal amount of data in order to perform its function. I like breaking rules, so I’ve created an image that is antithetical to the Docker philosophy: arktronic/ubuntu-graphical.

What is it?

It’s a Docker container image that creates a minimal graphical Linux environment, accessible via SSH and RDP (Microsoft Remote Desktop). Running it produces a system based on Ubuntu, which you can customize: modify any configurations, install any applications, and generally do anything. Out of the box, it comes with the LXDE UI and Firefox. That’s it. Using apt you can install anything else available for Ubuntu. To make the container easy to work with, xrdp is pre-configured to accept RDP connections on its standard port, 3389. As of this writing, version 2.0 also supports audio over RDP, but it’s a bit buggy. You can, in fact, watch YouTube inside the container, if you so desire!


The short answer is, because I wanted to experiment.

The slightly longer answer is, I wanted to see if I could create a minimal desktop environment that could conceivably be used as a base for a software development container or perhaps a basic Linux system where people could try out a potentially destructive experiment (rm -rf /, anyone?) without expensive consequences.

Containers fascinate me, but not because of the usual DevOps reasons. Rather, I’m interested in what they can be used for, outside of application hosting. If I could instantly launch a container with a full-blown development environment or a graphics editing system or a DAW with various plugins already pre-configured, what opportunities could this open? This is what I’m interested in exploring.

What’s so terrible about this?

All right, it may not be terrible per se, but as mentioned in the introduction, it’s very antithetical to the Docker philosophy. Let’s go over that in a bit more detail.

Containers should be ephemeral

It should be very easy and cheap to create and destroy a container, so it shouldn’t have much (or any) state. This one, however, encourages customization of the environment, which makes it extremely stateful.

Containers should have one concern

Docker strongly encourages running multiple containers in concert with each other, to build up a system from its individual parts. This container instead has everything, including the kitchen sink (well, there’s an xrdp sink anyway), built right into it. While it could be argued that the one concern here is a working Linux environment, I wouldn’t buy that: it’s like saying, Amazon’s shopping ecosystem is a single concern. That’s too high level to be of any use.

Containers should be minimal

In order to facilitate quick and easy creation and destruction of containers, they should only include what is absolutely necessary for them to run. Optional components should not be added in the first place or be removed as part of the image building process. Obviously, since this container is intended to be used by a human, rather than an application, it has to have a bunch of optional components to make it easier to use.

Okay then, who’s it for?

It’s for anyone interested in exploring Linux or expanding the possibilities of containers. But really, it’s mostly for people to play around.

You can get it here:, and the GitHub repo is over here:

P.S. I apologize for doing this to the Docker logo:

A shocked Docker whale mascot, badly modified