Putzfee gesucht: Docker Hosts sauber halten

Ja klar, Applikationscontainer sind klein und leichtgewichtig, aber durch Methoden, wie CI/CD werden die Release-Zyklen immer kleiner. Es wird also immer häufiger gebaut und verschifft. Dadurch entstehen zwar kleine, aber viele ungenutzte Images, Container, Volumes und Netzwerke.

So geschehen auf unserem Jenkins-Server. Um für Ordnung zu Sorgen gibt es seit Docker Version 1.13 den Befehl docker system prune. Alternativ kann man auch kleinteiliger vorgehen und einen der folgenden Befehle nutzen:

# Remove unused images
docker image prune

# Remove all stopped containers
docker container prune

# Remove all unused volumes
docker volume prune

# Remove all unused networks
docker network prune

Auf der eigenen Entwicklungsmaschine reicht es sicher einen solchen Befehl gelegentlich mal auszuführen. Im Produktivsystem könnte man auf jedem Docker Host einen Cronjob einrichten, der regelmäßig einen solchen Aufräum-Befehle startet, allerdings gibt es eine eleganter Variante. Wir nutzen den Swarm Mode von Docker, der als Orchestrator die Möglichkeit besitzt Container auf den verschiedenen Nodes im Cluster laufen zu lassen. Wir halten also gleich unser gesamtes Docker Cluster sauber! Im Container benötigen wir dafür lediglich Docker CLI und den Docker Socket (/var/run/docker.sock) des Host-Systems, damit der Aufräum-Befehl auf dem Host-System ausgeführt werden kann. Den Code dazu findet ihr auf GitHub und das Image liegt im Docker Hub.

Einen eingerichtet Swarm Mode vorausgesetzt, könnt ihr die Putzfee per docker service create anstoßen oder per Stack File. Das Ganze sieht dann so aus:

# Option 1: docker service command
docker service create \
    --name docker-system-prune \
    --mount type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
    --mode global \
    --restart-delay 86400s \
    servivum/docker-system-prune

# Option 2: Docker stack file
docker stack deploy -c docker-compose.yml docker-system-prune

Für Option 2 wird natürlich noch das Compose File benötigt. Das findet man ebenfalls auf GitHub. --restart-delay 86400s sorgt dafür, dass einmal am Tag der Container neugestartet wird, denn nach dem Reinigungsprozess beendet sich der Container von selbst. Und so konnte ich auch unseren Jenkins-Server von Altlasten befreien: Total reclaimed space: 342.6GB 😅

Patrick Baber

Als erfahrener Programmierer löst Patrick jeden Gordischen Knoten, findet die geeignete Methode und entwickelt damit flexible Software-Systeme.