Docker Best Practices für das Erstellen und Ausführen von Containern

Docker Best Practices für das Erstellen und Ausführen von Containern

Docker Best Practices sind bewährte Richtlinien, mit denen Sie Container sicher und effizient erstellen, ausführen und verwalten.

Docker bündelt Anwendungen und ihre Abhängigkeiten in portablen Containern, die sich in unterschiedlichen Umgebungen konsistent ausführen lassen.

Einheitliche Umgebungen vereinfachen Entwicklung und Bereitstellung. Für eine zuverlässige Containerisierung reicht es jedoch nicht aus, eine Anwendung lediglich in einem Image zu verpacken.

Die wichtigsten Best Practices betreffen daher die Bereiche, die sich in realen Umgebungen besonders stark auswirken: Image-Optimierung, effiziente Builds, Container-Sicherheit, Secret-Verwaltung, Observability und die Vorbereitung auf die Orchestrierung.

Zusammen sorgen diese Maßnahmen dafür, dass sich Container über ihren gesamten Lebenszyklus hinweg einfacher bereitstellen, skalieren, absichern und verwalten lassen.

1. Verwenden Sie offizielle und schlanke Basis-Images

Offizielle Images stammen von vertrauenswürdigen Maintainern und bieten damit eine sicherere Grundlage für Ihre Container. Schlanke Images enthalten weniger Pakete, Tools und Bibliotheken im finalen Image.

Minimalistische Basis-Images wie Alpine beschränken sich auf die wesentlichen Komponenten, die zum Ausführen einer Anwendung erforderlich sind, und halten Container dadurch schlank.

Profi-Tipp

Bevorzugen Sie für Produktions-Workloads Distroless-Images, etwa die von Google bereitgestellten Varianten, wenn Sie die Angriffsfläche so klein wie möglich halten möchten. Alpine-basierte Images eignen sich dagegen, wenn Sie während der Entwicklung eine Shell oder einen Paketmanager für das Debugging benötigen.

Größere Allzweck-Images enthalten mehr Systemprogramme und Abhängigkeiten. Dadurch müssen im Laufe der Zeit auch mehr Komponenten gepatcht, gescannt und abgesichert werden. Jedes zusätzliche Paket enthält Code, der gepflegt werden muss. Wenn Sie nicht benötigte Komponenten entfernen, reduzieren Sie Schwachstellen und beschleunigen das Erstellen, Herunterladen und Starten von Images.

2. Fixieren Sie Versionen von Basis-Images für reproduzierbare Builds

Fixieren Sie bestimmte Versionen von Basis-Images, damit Builds reproduzierbar bleiben und sich nicht unerwartet verändern. Allgemeine Tags wie latest schaffen Unsicherheit, da sich das zugrunde liegende Image jederzeit ändern kann.

Ein Dockerfile, das heute funktioniert, kann morgen ein anderes Image erzeugen, obwohl sich am Anwendungscode nichts geändert hat.

Durch die Versionsfixierung werden Deployments berechenbarer, da für jeden Build dieselbe Version des Basis-Images verwendet wird.

Tags wie node:22.11-alpine oder python:3.12-slim helfen, unbemerkte Änderungen an Abhängigkeiten, unerwartete Paket-Updates und Kompatibilitätsprobleme zu vermeiden, die sich nach dem Deployment nur schwer diagnostizieren lassen.

Teams, die noch stärkere Garantien benötigen, können zusätzlich zu Versions-Tags auch Image-Digests fixieren. Ein Image-Digest verweist auf einen bestimmten Image-Build und stellt sicher, dass Docker jedes Mal exakt dasselbe Image abruft.

Der Nachteil ist der zusätzliche Wartungsaufwand, da fixierte Digests nicht automatisch aktualisiert werden. Sicherheitspatches und neue Releases müssen manuell geprüft und im Dockerfile aktualisiert werden.

3. Schreiben Sie effiziente Dockerfiles

Achten Sie beim Schreiben von Dockerfiles auf Image-Größe, Build-Geschwindigkeit und Sicherheit. Der Aufbau des Dockerfiles bestimmt, wie viele Layer Docker erstellt, wie viele Daten das finale Image enthält und wie effizient spätere Builds bereits zwischengespeicherte Arbeit wiederverwenden können.

Effiziente Dockerfiles vermeiden unnötige Abhängigkeiten und entfernen temporäre Dateien nach der Paketinstallation.

Build-Tools, Paket-Caches, Protokolle und heruntergeladene Archive sollten nicht im Runtime-Image verbleiben, sofern die Anwendung sie nicht benötigt. Zusätzliche Dateien vergrößern das Image und erhöhen die Zahl der Komponenten, die gescannt, gepatcht und gepflegt werden müssen.

Auch die Verwaltung der Layer ist wichtig. Fassen Sie zusammengehörige Befehle in einer einzigen RUN-Anweisung zusammen, um unnötige Layer zu vermeiden. Ein kleineres Image ist allerdings nur dann von Vorteil, wenn spätere Entwickler nachvollziehen können, wie es erstellt wird, und die Anweisungen sicher aktualisieren können.

Vorhersehbar aufgebaute Dockerfiles lassen sich langfristig leichter pflegen. Eine klare Reihenfolge der Anweisungen, explizit definierte Abhängigkeiten und gut lesbare Befehle verringern unerwartete Build-Ergebnisse und erleichtern die Fehlersuche bei Deployments.

4. Reduzieren Sie die Image-Größe mit Multi-Stage-Builds

Trennen Sie mit Multi-Stage-Builds die für den Build benötigten Tools von den Runtime-Abhängigkeiten. Build-Tools, Compiler, Paketmanager und Quelldateien werden nur während des Builds benötigt.

Das finale Image enthält lediglich die kompilierte Anwendung und die Dateien, die für deren Ausführung erforderlich sind.

Multi-Stage-Builds verkleinern Images, indem sie Komponenten ausschließen, die zur Runtime nicht benötigt werden. Kleinere Images lassen sich schneller übertragen und starten und benötigen weniger Speicherplatz.

Werden Build-Tools und Entwicklungsabhängigkeiten entfernt, verringert sich außerdem die Angriffsfläche, da im laufenden Container weniger Komponenten verfügbar sind.

Besonders effektiv sind Multi-Stage-Builds bei kompilierten Anwendungen und Projekten mit umfangreichen Build-Abhängigkeiten.

Sprachen, Runtimeumgebungen und Bibliotheken wie Go, Java, .NET, Node.js und React profitieren häufig von diesem Ansatz, weil die Build-Umgebung deutlich größer ist als die Runtime-Umgebung.

Profi-Tipp

Ein einfaches Multi-Stage-Dockerfile verwendet für jede Stage eine eigene FROM-Anweisung. Benennen Sie die Build-Stage, zum Beispiel mit FROM node:20-alpine AS builder, führen Sie die Build-Schritte aus und beginnen Sie anschließend eine neue Stage mit einem schlanken Basis-Image. Kopieren Sie darin mit COPY --from=builder ausschließlich die kompilierten Ausgabedateien.

Durch diese Trennung bleiben Produktions-Images schlank, ohne den Entwicklungsworkflow unnötig zu verkomplizieren.

5. Optimieren Sie die Nutzung des Docker-Build-Caches

Nutzen Sie den Docker-Build-Cache effizient, um Build-Zeiten zu verkürzen und unnötige Arbeit bei erneuten Builds zu vermeiden. Docker speichert jede Anweisung als wiederverwendbaren Layer. Unveränderte Teile des Build-Prozesses können dadurch aus dem Cache übernommen werden, statt jedes Mal neu erstellt zu werden.

Ordnen Sie die Anweisungen im Dockerfile danach, wie häufig sie sich voraussichtlich ändern: von seltenen zu häufigen Änderungen.

Platzieren Sie stabile Anweisungen zuerst. Die Installation von Systempaketen, die Dependency-Dateien und die grundlegende Konfiguration ändern sich in der Regel seltener als der Quellcode der Anwendung.

Kopieren Sie deshalb zunächst die Dependency-Dateien und erst danach die vollständige Anwendung. So kann Docker die Layer für die Installation der Abhängigkeiten wiederverwenden, wenn sich lediglich der Anwendungscode geändert hat.

Formulieren Sie auch die Paketinstallation sorgfältig. Fassen Sie apt-get update und apt-get install in einer einzigen Anweisung zusammen, damit die Paketindizes mit den installierten Paketen übereinstimmen.

Entfernen Sie Paket-Caches nach der Installation, damit keine unnötigen Dateien im Image gespeichert werden. Kleinere Images lassen sich schneller übertragen, benötigen weniger Speicherplatz und enthalten weniger Daten, die gescannt und gepflegt werden müssen.

Sortieren Sie mehrzeilige Argumente, sofern dies sinnvoll ist. Sortierte Paketlisten reduzieren doppelte Einträge, erleichtern Reviews und machen Änderungen schneller erkennbar, wenn Abhängigkeiten hinzugefügt oder entfernt werden.

6. Schließen Sie unnötige Dateien mit .dockerignore aus

Verwenden Sie eine .dockerignore-Datei, um Dateien und Verzeichnisse vom Build auszuschließen, die dafür nicht benötigt werden.

Docker überträgt vor dem Erstellen eines Images den gesamten Build-Kontext an den Docker-Daemon. Unnötige Dateien erhöhen daher die zu verarbeitende Datenmenge und erhöhen zugleich das Risiko, versehentlich sensible Informationen einzubeziehen.

Schließen Sie sensible Dateien wie .env-Dateien, SSH-Schlüssel, Zugangsdaten, lokale Konfigurationsdateien und andere Secrets aus.

Wenn solche Dateien versehentlich in den Build-Kontext gelangen, steigt das Risiko, dass sensible Informationen über Container-Images, Image-Registries oder Build-Systeme offengelegt werden.

Schließen Sie auch Inhalte aus, die für den Build nicht erforderlich sind. Metadaten der Versionsverwaltung, lokale Protokolle, temporäre Dateien, Testartefakte, Dependency-Caches und Entwicklungsverzeichnisse erhöhen die Datenmenge, die Docker bei Builds verarbeiten muss.

Ein kleinerer Build-Kontext beschleunigt das Erstellen von Images, vermeidet unnötig große Images und sorgt dafür, dass Container-Images auf die Dateien beschränkt bleiben, die zum Ausführen der Anwendung erforderlich sind.

7. Führen Sie Container als Non-Root-Benutzer aus

Prozesse, die als Root ausgeführt werden, verfügen innerhalb des Containers über erweiterte Rechte. Dadurch können die Folgen einer Kompromittierung schwerwiegender ausfallen.

Eine Schwachstelle, über die Angreifer Befehle innerhalb eines Containers ausführen können, wird gefährlicher, wenn die Anwendung mit uneingeschränkten Berechtigungen läuft.

Erstellen Sie einen eigenen Benutzer für die Anwendung und wechseln Sie im Dockerfile mit der USER-Anweisung zu diesem Benutzer. Wird die Anwendung unter einem Non-Root-Konto ausgeführt, sind die Zugriffs- und Änderungsmöglichkeiten des Prozesses eingeschränkt. Dadurch lässt sich der mögliche Schaden reduzieren, falls die Anwendung kompromittiert wird.

Wenden Sie das Prinzip der geringsten Rechte auch auf Dateien und Verzeichnisse an. Gewähren Sie Containern nur Zugriff auf die Dateien und Ressourcen, die sie für den normalen Betrieb benötigen, und konfigurieren Sie die Dateisystemberechtigungen entsprechend.

Wenn Sie Berechtigungen sowohl auf Benutzer- als auch auf Dateisystemebene einschränken, reduzieren Sie die Angriffsfläche und begrenzen die Auswirkungen von Sicherheitsvorfällen.

8. Verwalten Sie Secrets zur Runtime sicher

Fest im Code hinterlegte API-Schlüssel, Datenbankpasswörter, Zugriffstoken und Zertifikate bleiben im Image eingebettet und können über Quellcode-Repositorys, Container-Registries, Image-Scans oder gemeinsam genutzte Build-Artefakte offengelegt werden.

Wenn Sie Secrets aus Container-Images heraushalten, verhindern Sie, dass Zugangsdaten zusammen mit dem Anwendungscode verteilt werden.

Warning

Übergeben Sie Secrets nicht mit --build-arg als Docker-Build-Argumente. Auf diese Weise übermittelte Werte werden in der Image-History bzw. den Image-Layern gespeichert und können mit docker history ausgelesen werden, selbst wenn sie im finalen Image oder Dockerfile nicht sichtbar sind.

Speichern Sie sensible Werte mit Tools, die für die Secret-Verwaltung vorgesehen sind, beispielsweise HashiCorp Vault, AWS Secrets Manager oder Azure Key Vault.

Docker Secrets bieten eine sicherere Möglichkeit, Zugangsdaten direkt in laufende Container einzubinden, ohne sie in Umgebungsvariablen, Image-Layern oder Prozesslisten offenzulegen.

Umgebungsvariablen sind für die Runtime-Konfiguration weit verbreitet, sollten bei Secrets jedoch nur als Ausweichlösung dienen. Sie lassen sich über docker inspect einsehen und können in Protokollen auftauchen, wenn eine Anwendung ihre Umgebung ausgibt.

Befolgen Sie die Best Practices für Umgebungsvariablen: Speichern Sie sensible Werte außerhalb des Anwendungscodes, beschränken Sie den Zugriff auf Zugangsdaten und verhindern Sie, dass Secrets in Protokolle geschrieben werden.

Bei größeren Deployments kommen häufig externe Plattformen für die Secret-Verwaltung zum Einsatz, um Zugangsdaten, Zugriffssteuerung, Audits und Rotation zentral zu verwalten.

Um die Offenlegung von Secrets zu verhindern, reicht die Wahl der richtigen Speichermethode allein nicht aus. Beschränken Sie den Zugriff auf sensible Werte, vermeiden Sie das Protokollieren von Zugangsdaten, prüfen Sie Images auf versehentlich enthaltene Secrets und rotieren Sie Zugangsdaten regelmäßig.

9. Begrenzen Sie Container-Berechtigungen und Ressourcen

Container sollten nur über die Berechtigungen verfügen, die sie für ihre vorgesehene Funktion benötigen. Begrenzen Sie daher Container-Capabilities und Ressourcen nach dem Prinzip der geringsten Rechte.

Unnötige Berechtigungen verschärfen die Folgen einer Kompromittierung, weil Angreifer dadurch auf mehr Systemressourcen und Funktionen zugreifen können, als die Anwendung tatsächlich benötigt.

Führen Sie Container möglichst nicht als Root aus und beschränken Sie den Zugriff auf sensible Bereiche des Host-Systems.

User Namespaces ordnen Benutzer innerhalb eines Containers weniger privilegierten Benutzern auf dem Host zu. Dadurch sinkt das Risiko von Container-Escapes und Rechteausweitungen.

Schreibgeschützte Dateisysteme bieten eine weitere Schutzebene, da weder Anwendungen noch Angreifer Dateien verändern können, die im normalen Betrieb unverändert bleiben sollten.

Entfernen Sie Capabilities, die die Anwendung nicht benötigt. Viele Container brauchen keine erweiterten Berechtigungen für Netzwerkfunktionen, Systemadministration oder Kernel-nahe Aufgaben, dennoch können solche Capabilities standardmäßig verfügbar sein.

Durch die Einschränkung von Capabilities verringern Sie die Zahl der Aktionen, die ein kompromittierter Container ausführen kann, und reduzieren die gesamte Angriffsfläche.

Legen Sie außerdem explizite Ressourcenlimits fest, damit einzelne Container nicht mehr CPU-Leistung oder Arbeitsspeicher belegen als vorgesehen. Ohne solche Limits kann ein einzelner Container die Ressourcen des Hosts ausschöpfen und andere Workloads auf demselben System beeinträchtigen.

10. Konzipieren Sie Container zustandslos und kurzlebig

Konzipieren Sie Container so, dass sie zustandslos und kurzlebig sind und jederzeit beendet, gelöscht und neu erstellt werden können, ohne dass wichtige Daten verloren gehen.

Ein Container sollte den Anwendungsprozess ausführen und nicht als dauerhafter Speicherort für Dateien, Datenbanken, Sitzungen oder Benutzer-Uploads dienen.

Speichern Sie persistente Daten außerhalb des Containers. Docker Volumes, verwaltete Datenbanken, Object Storage und externe Dienste sorgen dafür, dass wichtige Daten auch dann verfügbar bleiben, wenn Container bei Updates, Ausfällen oder Skalierungsvorgängen ersetzt werden.

Die Trennung von Anwendungs-Runtime und persistentem Speicher vereinfacht außerdem Backups, Migrationen und Wiederherstellungsprozesse.

Zustandslose Container lassen sich leichter skalieren und orchestrieren. Orchestrierungsplattformen können ausgefallene Container neu starten, Workloads zwischen Hosts verschieben und zusätzliche Replikate erstellen, ohne von Daten abhängig zu sein, die in einer bestimmten Container-Instanz gespeichert sind.

11. Fügen Sie Health Checks für dauerhaft laufende Dienste hinzu

Mit Health Checks für dauerhaft laufende Dienste können Docker und Orchestrierungsplattformen erkennen, wenn ein Container nicht mehr ordnungsgemäß funktioniert.

Ein laufender Container ist nicht zwangsläufig auch ein funktionierender Container. Eine Anwendung kann beispielsweise nicht mehr auf Anfragen reagieren, die Verbindung zur Datenbank verlieren oder in einen Fehlerzustand geraten, während der Container-Prozess weiterhin läuft.

Mit der HEALTHCHECK-Anweisung kann Docker regelmäßig Prüfungen ausführen und den Health-Status eines Containers melden.

Health Checks können beispielsweise prüfen, ob eine Anwendung auf HTTP-Anfragen antwortet, Verbindungen akzeptiert oder andere grundlegende Funktionen ausführt, die für den normalen Betrieb erforderlich sind.

Profi-Tipp

Stimmen Sie die Parameter --interval, --timeout und --retries auf die Startzeit Ihrer Anwendung ab. Benötigt ein Dienst beispielsweise 30 Sekunden für die Initialisierung, verwenden Sie --start-period=30s, damit während des Starts keine falschen Fehlermeldungen gemeldet werden.

Container-Orchestratoren nutzen den Health Status für automatisierte Wiederherstellungsmaßnahmen. Fehlgeschlagene Health Checks können einen Neustart des Containers, den Austausch fehlerhafter Instanzen oder das Entfernen von Containern aus der Weiterleitung des Datenverkehrs auslösen.

Werden Anwendungsfehler frühzeitig erkannt, reduziert das Ausfallzeiten und trägt dazu bei, die Verfügbarkeit von Diensten in Produktionsumgebungen aufrechtzuerhalten.

12. Scannen Sie Images regelmäßig auf Schwachstellen

Regelmäßige Scans von Container-Images helfen, bekannte Schwachstellen zu erkennen, bevor die Images in die Produktionsumgebung gelangen.

Schwachstellen-Scanner wie Trivy, Docker Scout und Snyk gleichen installierte Pakete, Bibliotheken und Abhängigkeiten mit Sicherheitsdatenbanken ab. So können Teams veraltete Software und bekannte Sicherheitsprobleme bereits früh im Entwicklungsprozess erkennen.

Integrieren Sie Image-Scans in CI/CD-Pipelines, damit Sicherheitsprüfungen bei Builds und Deployments automatisch ausgeführt werden.

Automatisierte Scans helfen dabei, Schwachstellen zu erkennen, bevor Images in Registries veröffentlicht oder in Produktionsumgebungen bereitgestellt werden. Dadurch sinkt das Risiko, unsichere Releases produktiv einzusetzen.

Scannen Sie sowohl das Basis-Image als auch die Anwendungslayer. Selbst eine sichere Anwendung kann Schwachstellen von einem veralteten Basis-Image übernehmen. Umgekehrt schützt auch ein vollständig gepatchtes Basis-Image nicht vor unsicheren Anwendungsabhängigkeiten.

Die Prüfung des gesamten Images vermittelt ein genaueres Bild der Container-Sicherheit und hilft dabei, Behebungsmaßnahmen vor dem Deployment zu priorisieren.

13. Überwachen und protokollieren Sie Container-Aktivitäten

Durch die Überwachung und Protokollierung von Container-Aktivitäten behalten Sie den Überblick über Zustand, Leistung und Fehler Ihrer Anwendungen.

Containerisierte Umgebungen sind dynamisch: Container werden regelmäßig gestartet, beendet, skaliert und ersetzt. Ohne zuverlässige Observability wird es erheblich schwieriger, die Ursache von Leistungsproblemen oder Anwendungsausfällen zu ermitteln.

Zentralisieren Sie Protokolle und erfassen Sie Metriken von Containern, Hosts und unterstützenden Diensten. Eine zentrale Protokollierung erleichtert die Fehlersuche in verteilten Anwendungen. Metriken helfen dabei, Ressourcenauslastung, Antwortzeiten, Anfragevolumen und weitere Indikatoren für den Zustand einer Anwendung zu überwachen.

Zusammen liefern Protokolle und Metriken den nötigen Kontext, um Probleme zu beheben und Leistungsengpässe zu erkennen.

Verwenden Sie Monitoring-Tools, die sich gut in containerisierte Umgebungen integrieren lassen. Prometheus und Grafana werden häufig für die Erfassung und Visualisierung von Metriken eingesetzt. Lösungen wie der ELK Stack aus Elasticsearch, Logstash und Kibana sowie Loki helfen dabei, Container-Protokolle zentral zu erfassen und auszuwerten.

Das Erfassen von Protokollen und Metriken ist jedoch nur dann hilfreich, wenn die zuständigen Personen bei Problemen benachrichtigt werden. Konfigurieren Sie Warnmeldungen für Zustände, die auf tatsächliche Probleme hinweisen, etwa dauerhaft hohe CPU- oder Arbeitsspeicherauslastung, sprunghaft steigende Fehlerraten, fehlgeschlagene Health Checks oder Container, die wiederholt neu starten.

Leiten Sie Warnmeldungen an die passenden Kanäle weiter, beispielsweise an eine Messaging-Plattform, ein Incident-Management-Tool oder den Bereitschaftsdienst. So können Probleme diagnostiziert werden, bevor sie Nutzer beeinträchtigen.

14. Bereinigen Sie ungenutzte Docker-Ressourcen

Bereinigen Sie ungenutzte Docker-Ressourcen regelmäßig, um Speicherplatz freizugeben und Container-Hosts übersichtlich zu halten.

Ungenutzte Images, angehaltene Container, verwaiste Volumes und nicht verwendete Netzwerke sammeln sich mit der Zeit an. Besonders häufig tritt dies in Entwicklungsumgebungen und CI/CD-Systemen auf, in denen Images regelmäßig erstellt und bereitgestellt werden.

Entfernen Sie nicht mehr benötigte Ressourcen mit Docker-Bereinigungsbefehlen wie docker image prune, docker container prune, docker volume prune und docker system prune.

Warning

Der Befehl docker system prune -a entfernt alle ungenutzten Images und nicht nur Dangling Images. Dazu gehören auch Images, die derzeit keinem laufenden Container zugeordnet sind, aber möglicherweise für spätere Deployments benötigt werden. Prüfen Sie in gemeinsam genutzten Umgebungen und Produktionsumgebungen immer, welche Ressourcen entfernt werden, bevor Sie diesen Befehl ausführen.

Automatisierte Bereinigungsskripte und geplante Wartungsaufgaben helfen, die Ansammlung ungenutzter Ressourcen auf dauerhaft betriebenen Hosts zu verhindern, ohne dass Sie diese regelmäßig manuell entfernen müssen.

Der Speicherverbrauch wirkt sich nicht nur auf die Festplattenauslastung aus. Große Mengen ungenutzter Ressourcen erschweren die Verwaltung von Umgebungen, vergrößern Backups und belegen Speicher, der stattdessen für aktive Workloads zur Verfügung stehen könnte.

15. Testen Sie Container vor dem Deployment

Testen Sie Container vor dem Deployment, um sicherzustellen, dass ein Image unter denselben Bedingungen funktioniert wie später in der Produktionsumgebung.

Ein erfolgreicher Build bestätigt lediglich, dass Docker ein Image erstellen konnte. Er belegt nicht, dass die Anwendung korrekt startet, Verbindungen zu den benötigten Diensten herstellt, Datenverkehr verarbeitet oder die Sicherheitsanforderungen erfüllt.

Integrieren Sie Container-Tests in den Entwicklungsworkflow. Unit-Tests prüfen die Anwendungslogik, Integrationstests überprüfen Dienstverbindungen innerhalb der Container und Sicherheitsscans suchen vor dem Release nach bekannten Schwachstellen in Images.

Auch Performance-Tests helfen dabei, lange Startzeiten, ungeeignete Ressourcenlimits und Runtime-Probleme zu erkennen, die nur in der containerisierten Umgebung auftreten.

Automatisieren Sie Container-Tests, wo immer dies möglich ist. CI/CD-Tools wie GitHub Actions, GitLab CI/CD, Jenkins und CircleCI können Images erstellen, Tests ausführen, Schwachstellen-Scans durchführen und ein Deployment blockieren, wenn eine Prüfung fehlschlägt.

Automatisierte Tests verringern das Risiko, fehlerhafte oder unsichere Container in Produktionsumgebungen bereitzustellen.

So wählen Sie die richtige Plattform für die Container-Orchestrierung

Wählen Sie die Plattform für die Container-Orchestrierung anhand der Komplexität Ihrer Umgebung, Ihrer Skalierungsanforderungen, der verfügbaren betrieblichen Ressourcen und des Integrationsbedarfs aus.

Entscheidend ist weniger der reine Funktionsumfang als vielmehr die Frage, wie viel Infrastruktur Sie selbst verwalten müssen.

Bewerten Sie zunächst Größe und Komplexität des Workloads. Anwendungen mit wenigen Containern benötigen in der Regel weniger Orchestrierungsfunktionen als große verteilte Systeme mit Dutzenden oder Hunderten von Diensten.

Eine leistungsfähigere Plattform zu verwalten, als der Workload tatsächlich erfordert, verursacht zusätzlichen Betriebsaufwand, ohne einen entsprechenden Nutzen zu bieten.

Berücksichtigen Sie anschließend den erforderlichen Automatisierungsgrad. Kubernetes bietet fortgeschrittene Funktionen wie automatische Skalierung, Self-Healing, Service Discovery und Rolling Updates.

Diese Funktionen sind in großen Produktionsumgebungen wertvoll, bringen jedoch zusätzlichen Aufwand bei Einrichtung, Wartung und Betrieb mit sich.

Docker Swarm und HashiCorp Nomad sind einfachere Alternativen. Docker Swarm ist eng in Docker integriert und erfordert weniger zu verwaltende Komponenten als Kubernetes.

Nomad unterstützt sowohl containerisierte als auch nicht containerisierte Workloads und lässt sich gut mit Tools wie Consul und Vault integrieren.

Beide Plattformen eignen sich, wenn keine fortgeschrittenen Orchestrierungsfunktionen erforderlich sind.

Prüfen Sie vor der endgültigen Entscheidung auch die Community-Unterstützung und den Reifegrad des Ökosystems. Kubernetes verfügt über das größte Ökosystem, die umfangreichste Tool-Unterstützung und die umfassendste Dokumentation.

Kleinere Plattformen können einfacher zu betreiben sein, bieten jedoch weniger Integrationen von Drittanbietern und weniger Lernressourcen.

Die Orchestrierungsplattform ist nur ein Bestandteil der Deployment-Strategie. Ebenso wichtig ist eine zuverlässige Infrastruktur für den Betrieb containerisierter Workloads.

Das Docker VPS-Hosting von Hostinger bietet dedizierte CPU-, RAM- und Speicherressourcen sowie einen integrierten Docker Manager, automatische Backups und KI-gestützte Tools zur Serververwaltung, die die Bereitstellung und Verwaltung von Containern vereinfachen.

Dieser Artikel ist eine lokalisierte Version von Docker best practices for building and running containers, der ursprünglich in englischer Sprache veröffentlicht wurde.

Alle Tutorial-Inhalte auf dieser Website unterliegen Hostingers strengen redaktionellen Standards und Normen.

Vera ist eine erfahrene Lokalisierungs-Spezialistin bei Hostinger und optimiert erfolgreich Inhalte für globale Zielgruppen. Dank ihres umfassenden SEO-Wissens sorgt sie dafür, dass Hostingers Webhosting-Dienste für ein breites Publikum sichtbar, zugänglich und attraktiv sind. Mit Kreativität und Präzision überwindet sie Sprachbarrieren in ihren Projekten und trägt so dazu bei, Hostingers Reichweite zu vergrößern und Kunden weltweit ein nahtloses Erlebnis zu bieten.

Trusted by 4+ million website owners worldwide

See our 73.107 reviews on Trustpilot

Comments

0 responses

Write a response

Please fill the required fields.Bitte akzeptieren Sie die Datenschutzklausel.Bitte füllen Sie die erforderlichen Felder aus und akzeptieren Sie die Datenschutzklausel.

Thank you! Your comment has been successfully submitted. It will be approved within the next 24 hours.