3 Strategien für automatisierte Produktionsbereitstellungen mit Docker

0
124

Docker ist ein beliebtes Entwicklungstool, da es das Starten isolierter Instanzen Ihrer Anwendung vereinfacht mit reproduzierbarer Konfiguration. Es kann auch in der Produktion verwendet werden, wo es sicherstellt, dass Live-Bereitstellungen mit Ihrer Entwicklungsumgebung identisch sind.

Einen Container in die Produktion zu bringen, ist nicht immer so einfach wie das Ausführen von Docker auf Ihrem lokalen Computer. Es ist keine gute Idee, Images manuell in eine Registrierung zu verschieben, eine Verbindung zu einem Remote-Docker-Host herzustellen und Ihre Container zu starten. Dies ist auf menschliches Eingreifen angewiesen, daher ist es zeitaufwändig und fehleranfällig.

In diesem Leitfaden sehen wir uns drei verschiedene Strategien an, die Sie verwenden können, um Docker-Bereitstellungen einfach zu automatisieren und eine konsistente Konfiguration aufrechtzuerhalten. Diese Ansätze können als Teil einer CI-Pipeline skriptgesteuert werden, um jedes Mal, wenn sich Ihr Code ändert, neue Container zu starten. Sie müssen Ihre Docker-Images erstellen und sie als erste Phase Ihres Skripts in eine Registrierung übertragen und dann eine der folgenden Techniken verwenden, um das Image abzurufen und Container in Ihrer Produktionsumgebung zu starten.

1. Docker Compose über SSH

Mit Docker Compose können Sie mehrere Container mit einem einzigen Befehl starten. Darüber hinaus wird Compose über eine YAML-Datei konfiguriert, die Ihnen bei Versionsänderungen hilft und reproduzierbare Bereitstellungen garantiert.

Vielleicht haben Sie Compose bereits als lokales Entwicklungstool verwendet. Sie müssen eine docker-compose.yml-Datei in Ihrem Arbeitsverzeichnis erstellen und dann einen oder mehrere Dienste hinzufügen, die die zu startenden Container definieren:

version: 3 services: app: image: example.com/app:latest ports : – 80:80 Datenbank: Bild: mysql:8.0 exponiert: – 3306 Werbung

Sobald Sie eine Compose-Datei haben, verwenden Sie den Befehl docker-compose up -d, um Ihre Container zu starten. Wenn Sie die Datei ändern, wiederholen Sie den Befehl, um Ihre Änderungen zu übernehmen. Compose aktualisiert oder ersetzt Container, um den neu deklarierten Zustand zu erreichen.

Das Hinzufügen des –pull-Flags weist Compose an, zu versuchen, aktualisierte Images abzurufen, bevor Container gestartet werden. Sie können auch –force-recreate verwenden, um die Erstellung neuer Container zu erzwingen, selbst wenn sich ihre zugrunde liegende Konfiguration nicht geändert hat.

Wie bezieht sich all dies auf Produktionsbereitstellungen? Das bedeutet, dass Sie Compose als Teil Ihrer CI-Pipeline verwenden können, um mühelos Container zu starten, die den Status erfüllen, den Sie in Ihrer docker-compose.yml-Datei deklarieren. Wenn Sie docker-compose up -d –pull in jeder Pipeline ausführen, erhalten Sie eine Reihe von Containern, die jeweils die neueste Version ihres Images ausführen.

 

Es gibt mehrere Möglichkeiten, wie Sie diese Methode implementieren können. Die einfachste und sicherste Route besteht darin, Docker und Compose auf Ihrem Produktionshost zu installieren und dann über SSH eine Verbindung damit herzustellen. Sie müssen die Einstellungen Ihres CI-Anbieters verwenden, um SSH-Anmeldeinformationen als Variablen zu speichern, auf die Ihre Pipeline zugreifen kann. Anschließend konfigurieren Sie den SSH-Client in Ihrer Pipeline, kopieren die Datei docker-compose.yml auf Ihren Remote-Host und führen den Befehl docker-compose up aus.

Hier ist ein Beispielskript :

mkdir -p ~/.ssh && chmod 700 ~/.ssh echo $SSH_PRIVATE_KEY | ssh-add – echo $SSH_HOST_KEY > ~/.ssh/known_hosts scp docker-compose.yml:ci-user@example.com:/home/ci-user/docker-compose.yml ssh -t ci-user@example.com docker-compose up -d < p>Alternativ könnten Sie Docker-Kontexte verwenden, um die Compose-Binärdatei lokal in der Umgebung Ihrer Pipeline auszuführen. Dazu müssten Sie den Docker-Socket auf Ihrem Remote-Host verfügbar machen; Da dies ein Sicherheitsrisiko darstellen kann, ist der Ansatz in Situationen, in denen auch SSH verwendet werden könnte, im Allgemeinen ungünstiger.

Nach dieser Methode müssten Sie Docker und Compose auf dem Host installieren, auf dem Ihre Pipelines ausgeführt werden. In Ihrem Pipeline-Skript würden Sie einen Docker-Kontext registrieren und auswählen, der auf Ihren Remote-Produktionshost verweist. Die Verbindungsdetails müssten als Variablen bereitgestellt werden, die im Einstellungsfeld Ihres CI-Anbieters festgelegt sind. Bei ausgewähltem Kontext würden Sie docker-compose up -d in der Umgebung Ihrer Pipeline ausführen, aber sehen, wie der Befehl auf dem Remote-Server ausgeführt wird.

2. Nutzung eines Platform-as-a-Service (PaaS)

Die Einführung eines Platform-as-a-Service (PaaS)-Angebots ist ein weiterer Ansatz, um Docker-Container in der Produktion auszuführen. Sie können Ihre eigenen Lösungen mit Lösungen wie Dokku selbst hosten oder ein gehostetes Angebot wie Amazon ECS, DigitalOcean App Platform oder Heroku wählen.

Werbung

Eine PaaS abstrahiert die Komplexität des Erstellens von Images, der Verwaltung detaillierter Konfigurationen und der Bereitstellung Ihrer eigenen Docker-Hosts. Sie verwenden entweder Git, um Ihr Repository direkt auf die Plattform zu übertragen, oder führen einen CLI-Befehl aus, um Ihre Änderungen hochzuladen. Die PaaS übernimmt die Containererstellung aus Ihren Quell-Assets, Dockerfiles oder plattformspezifischen Konfigurationsdateien.

PaaS-Lösungen sind eine großartige Möglichkeit, mit minimaler manueller Docker-Interaktion schnell online zu gehen. Sie lassen sich einfach in Ihre CI-Pipeline integrieren, und die meisten großen Anbieter bieten Beispielskripts an, um Ihnen den Einstieg zu erleichtern. Es ist jedoch möglich, aus einer PaaS herauszuwachsen, was bedeuten könnte, dass Sie Ihre Infrastruktur in Zukunft überdenken müssen.

Die Schritte zum Automatisieren der Bereitstellung auf der von Ihnen gewählten Plattform variieren je nach Anbieter. Wenn Sie Dokku oder ein ähnliches PaaS mit Git-Integration verwenden, könnte Ihr CI-Skript so einfach wie zwei Zeilen sein:

git remote add dokku dokku@example.com:app-name git push dokku master

Das Skript fügt Ihren Dokku-Server als Git-Remote hinzu und überträgt den Inhalt des Repositorys. Dokku erstellt automatisch ein Image aus Ihrem Dockerfile und startet Containerinstanzen. Damit dies funktioniert, müssen Sie den öffentlichen SSH-Schlüssel Ihres CI-Servers zu Dokku hinzufügen. andernfalls wäre Ihr CI-Skript nicht in der Lage, sich bei der Plattform zu authentifizieren.

3. Orchestrierung mit Kubernetes/Docker Swarm

Die Verwendung eines Orchestrators wie Kubernetes oder Docker Swarm ist wohl die häufigste Art, Live-Containerinstanzen auszuführen. Diese Tools wurden speziell entwickelt, um Container in Produktionsumgebungen bereitzustellen und zu skalieren.

Werbung

Orchestratoren beseitigen die Komplexität des Infrastrukturmanagements, sodass Sie sich auf Ihre Anwendung und ihre Komponenten konzentrieren können. Ähnlich wie Docker Compose verfolgen sie einen deklarativen Ansatz für die Zustandskonfiguration, bei dem Sie definieren, wie der Endzustand aussehen soll. Der Orchestrator bestimmt die richtige Abfolge von Aktionen, um diesen Zustand zu erreichen.

Kubernetes ist der beliebteste Orchestrator. Eine Möglichkeit, mit Kubernetes-Clustern zu interagieren, ist Kubectl, das offizielle CLI-Verwaltungstool. Mit Kubectl können Sie Manifestdateien im YAML-Format anwenden, die die in Ihrem Cluster zu erstellenden Containerressourcen definieren.

Hier ist ein einfaches Manifest, das eine einzelne Containerinstanz erstellt:

apiVersion: apps/v1 Art: Bereitstellungsmetadaten: Name: Demo-Spezifikation: Replikate: 1 Selektor: MatchLabels: App: Demo-Vorlage: Metadaten: Labels: App: Demo-Spezifikation: Container: – Name: Demo-Image: example.com/image:latest

You können Kubectl verwenden, um dieses Manifest auf einen Cluster anzuwenden:

kubectl apply -f manifest.yaml

Spätere Änderungen an der Datei werden durch Wiederholen des Befehls übernommen. Kubernetes ergreift automatisch die erforderlichen Maßnahmen, um den neu deklarierten Zustand zu erreichen.

Das macht Kubernetes zu einer großartigen Option für automatisierte Produktionsbereitstellungen. Sie können kubectl apply in Ihren Pipelines verwenden, um die Manifeste in Ihrem Repository zu übernehmen und den deklarierten Zustand auf Ihren Cluster anzuwenden. Durch das Erstellen eines neuen Image-Tags für jeden Commit würde Kubernetes dieses Image abrufen und neue Container für die Bereitstellung starten.

Werbung

Um dies einzurichten, müssen Sie den Inhalt einer Kubeconfig-Konfigurationsdatei als Pipelinevariable bereitstellen. Dadurch erhält Kubectl die Anmeldeinformationen für Ihre Clusterverbindung. Die lokale Kubectl-Binärdatei würde dann gegen Ihren Remote-Cluster arbeiten.

Docker Swarm ist eine weitere Orchestrierungsoption, die in Docker integriert ist. Sie können einen Swarm-Stack mit derselben docker-compose.yml-Datei wie zuvor beschrieben einrichten. Dann könnten ähnliche Bereitstellungsansätze verwendet werden, entweder eine Verbindung zum Swarm-Host über SSH oder die Verwendung eines Docker-Kontexts, um das Ziel lokaler Docker-Binärdateien zu ändern.

Orchestrators sind viel komplexer als die Verwendung von einfachem Compose oder einem verwalteten PaaS . Im Fall von Kubernetes müssen Sie neue Abstraktionen, Terminologie und Konfigurationsdateiformate lernen, bevor Sie Ihre Container bereitstellen können. Cluster bieten Ihnen jedoch auch zusätzliche Funktionen, die die langfristige Wartung von Anwendungen erleichtern. Sie können Replikate einfach über mehrere Hosts skalieren, Redundanz einbauen und Protokolle und Metriken aggregieren.

Orchestrierung ist daher die beste Option für größere Systeme, auf denen mehrere Container ausgeführt werden. Das bedeutet nicht, dass die Aufmerksamkeit der Branche, die die Tools erhalten, Sie dazu veranlassen sollte, Kubernetes für jede Bereitstellung zu verwenden. Compose oder ein PaaS sind für kleinere Anwendungsfälle, in denen Sie sich weniger Gedanken über Skalierbarkeit und Anbieterbindung machen, einfacher einzurichten, zu begründen und zu warten.

Zusammenfassung< /h2>

Wir haben uns drei verschiedene Möglichkeiten zum Ausführen von Containern als Produktionsworkloads angesehen. Die Implementierungsdetails variieren je nach gewählter Strategie, unterstützender Toolkette und CI-Umgebung, daher haben wir auf eine genaue Beschreibung verzichtet, wie Sie die Automatisierung als Teil Ihres Workflows einrichten können. Alle drei können jedoch problemlos in eine CI-Pipeline integriert werden, die jedes Mal ausgeführt wird, wenn Sie Ihren Code zusammenführen oder übertragen.

Die Orchestrierung mit einem Tool wie Kubernetes hat sich schnell zur bevorzugten Methode für skalierbare Bereitstellungen von Systemen entwickelt, auf denen mehrere Container ausgeführt werden. Obwohl es den Betrieb der Dienste, für die es entwickelt wurde, erheblich vereinfachen kann, bringt es auch eine erhebliche Lernkurve und einen erheblichen Wartungsaufwand mit sich, sodass Sie nicht einsteigen sollten, ohne Alternativen in Betracht zu ziehen.

Werbung
< p>Kleinere Systeme, die aus wenigen Komponenten bestehen, erzielen möglicherweise bessere Ergebnisse, wenn Sie Compose verwenden, um Container mit einer reproduzierbaren Konfiguration auf einem vorhandenen Docker-Host zu starten. Dies bietet einige der Vorteile von Kubernetes, wie z. B. die deklarative Konfiguration, ohne die zusätzliche Komplexität. Sie können “nachlassen” zur späteren Orchestrierung, indem Sie Docker Swarm-Unterstützung zu Ihrer bestehenden Compose-Datei hinzufügen, sodass Sie mehrere verteilte Replikate von Containern starten können.

Schließlich beschleunigen die Platform-as-a-Service-Optionen die Anwendungsbereitstellung, ohne dass Sie über granulare Container nachdenken müssen Einzelheiten. Diese Dienste bieten die Aussicht auf vollständige Infrastrukturautomatisierung bei minimaler Konfiguration. Sie können jedoch langfristig einschränkend sein, also denken Sie darüber nach, wie Ihre Lösung im Laufe der Zeit wachsen wird, bevor Sie sich festlegen.

Beim Bereitstellen von Containern in der Produktion müssen Sie auch das Image-Hosting und berücksichtigen Konfigurationsinjektion. Sie können einen öffentlichen Registrierungsdienst verwenden, um Ihre Images in Ihrer Produktionsumgebung verfügbar zu machen. Alternativ können Sie Ihre eigene private Registrierung ausführen und Anmeldeinformationen als Teil Ihrer CI-Pipeline bereitstellen. Konfigurationswerte werden normalerweise als Umgebungsvariablen bereitgestellt, die Sie im Einstellungsbildschirm Ihres CI-Anbieters definieren können.