Wofür wir Docker einsetzen
In der Entwicklung: Jedes Projekt bringt seine Umgebung mit. PHP 8 in der Version, die das Projekt verlangt, dazu MariaDB, Redis und bei Bedarf Elasticsearch — beschrieben in einer Compose-Datei, die im Repository liegt. Wer neu ins Projekt kommt, startet die Umgebung und arbeitet. Das ersetzt die halbtägige Einrichtung eines lokalen Systems und die Diskussionen darüber, warum ein Fehler nur auf einem Rechner auftritt.
Im Betrieb setzen wir Container für eigene Anwendungen ein: Node.js-Dienste, Python-Werkzeuge, Schnittstellen zwischen Shop und Warenwirtschaft. Die Trennung nach Diensten ist dabei der eigentliche Gewinn. Datenbank, Cache und Suchindex laufen jeweils für sich, lassen sich einzeln aktualisieren und beeinflussen einander nicht. Klassische Shop- und CMS-Installationen betreiben wir dagegen häufig weiterhin auf einer dedizierten virtuellen Maschine — dazu unten mehr.
Wie wir mit Docker arbeiten
Ein Compose-Setup pro Projekt, versioniert im Git-Repository, mit denselben Diensten wie die Zielumgebung. Images bauen wir aus schlanken Basis-Images und pinnen Versionen fest, statt auf latest zu vertrauen — sonst ändert sich die Umgebung, ohne dass jemand etwas geändert hat. Konfiguration kommt über Umgebungsvariablen hinein, Zugangsdaten liegen nicht im Image. Datenbanken bekommen benannte Volumes, damit ein Neustart keine Daten kostet.
Gebaut und ausgerollt wird über die CI-Strecke: Tests laufen im Container, das Image wird gebaut, in eine Registry geschoben und auf der Zielmaschine gezogen. Die Zielmaschine ist bei uns in der Regel eine virtuelle Maschine im eigenen Proxmox-Cluster, Serverstandort Deutschland. Logs gehen nach außen, nicht in den Container. Und jeder Container bekommt Grenzen für Arbeitsspeicher und CPU, damit ein Ausreißer nicht den Nachbarn mitnimmt.
Grenzen und Alternativen
Container lösen kein Architekturproblem. Wer ein unklares System containerisiert, hat danach ein unklares System in Containern — nur mit mehr beweglichen Teilen. Bevor wir etwas in Container packen, klären wir, welche Dienste es überhaupt gibt, wo Zustand liegt und wie Daten fließen. Fällt diese Klärung aus, verschiebt Docker den Schmerz nur vom Server in die Build-Pipeline. Der zweite Punkt: Nicht jedes System gewinnt dabei.
Kubernetes ist für die allermeisten Mittelstandsprojekte Überbau. Ein Shop, ein CMS, ein paar Hintergrunddienste — dafür brauchen Sie keinen Cluster-Scheduler, sondern eine sauber dimensionierte Maschine. Der Betrieb von Kubernetes kostet Aufmerksamkeit, die im Projekt an anderer Stelle fehlt. Sinnvoll wird es, wenn wirklich viele Dienste zu orchestrieren sind oder mehrere Teams unabhängig ausrollen. Für einzelne TYPO3- oder Shopware-Installationen bleiben wir bei der virtuellen Maschine mit Backup und Snapshot.