Docker ist das derzeit omnipresente Werkzeug um Dienste in Containern auszuführen.

Wie kann man jedoch einen logischen Verbund an Diensten mit dem System zusammen starten?

Mit der Hilfe von Docker können Anforderungen eines Dienstes (z.B. Gitlab) an die Distribution innerhalb eines Containers befriedigt werden. Das ausführende System aussenherum bleibt davon unberührt und kann auch eine inkompatible Distribution sein.

In der Praxis werden jedoch oft mehrere Dienste in einem Verbund benötigt. Diese können mit dem Tool docker-compose beschrieben und gestartet werden.

Will man nun Dienste via docker-compose mit dem System zusammen starten, bietet sich folgende Vorgehensweise an:

Als erstes definieren wir ein Dienst-Template in einer neuen Datei /etc/systemd/system/dc@.service

[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always
TimeoutStartSec=1200

WorkingDirectory=/opt/dockerfiles/%i

# Remove old containers, images and volumes and update it
ExecStartPre=/usr/local/bin/docker-compose down -v
ExecStartPre=/usr/local/bin/docker-compose rm -fv
ExecStartPre=/usr/local/bin/docker-compose pull

# Compose up
ExecStart=/usr/local/bin/docker-compose up

# Compose down, remove containers and volumes
ExecStop=/usr/local/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target

Wir gehen dabei davon aus, dass alle docker-compose Konfigurationsdateien in /opt/dockerfiles/DIENSTNAME liegen und sich docker-compose im Verzeichnis /usr/local/bin liegt.

Nun legen wir unsere docker-compose.yml Datei z.B. in /opt/dockerfiles/gitlab/docker-compose.yml ab.

Nun weisen wir systemd an, das Template zu instanziieren:

sudo systemctl enable dc@gitlab

Ab sofort ist der Dienst vorhanden und kann auch direkt gestartet werden:

sudo systemctl start dc@gitlab

Beim starten des Dienstes wird auch das Image aktualisiert - ist dies nicht gewünscht, muss lediglich die entsprechende Zeile im Template entfernt werden.

Viel Spaß!