Stellen Sie sich dieses Szenario vor. Sie hosten einige Webdienste, die in Docker-Containern ausgeführt werden. Wenn der Webdienst eine neue Version veröffentlicht hat, rufen Sie das Docker-Image ab und aktualisieren die Container, um den Dienst zu aktualisieren.
Ich habe bereits früher über das Aktualisieren von Docker-Containern ohne Ausfallzeiten gesprochen, aber in diesem Artikel geht es nicht um das Aktualisieren der Web-Apps. Hier geht es um die Aktualisierung der Betriebssystem-Container selbst.
Das manuelle Upgrade des im Container ausgeführten Betriebssystems kann von Zeit zu Zeit eine entmutigende Aufgabe sein. Dazu müssen Sie die relevanten Upgrade-Befehle selbst auf einem laufenden Container ausführen.
Wie wäre es, wenn Sie diesen zusätzlichen Schritt eliminieren und die Aktualisierung des Betriebssystems mit der Aktualisierung des Dienstes kombinieren?
Dies ist ein Automatisierungstrick, den ich verwende, wenn ich einen Webdienst aktualisiere, der mit Docker Compose bereitgestellt wurde.
Basierend auf dieser Bereitstellung verwenden wir Ghost CMS als reales Beispiel.
DigitalOcean – Die Entwickler-Cloud, die Millionen von Entwicklern hilft, Anwendungen jeder Größe einfach zu erstellen, zu testen, zu verwalten und zu skalieren – schneller als je zuvor. DigitalOcean-LogoRoxana Ciobanu, CTOAutomatisches Upgrade von OS-Containern während der Aktualisierung des Webservice
Sie können diesen Artikel einfach lesen, um zu verstehen, was ich tue. Aber wenn Sie ihm folgen möchten, können Sie das auch tun.
Ich werde zwei verschiedene Beispiele zeigen:
- Für Debian-basierte Docker-Container
- Für Alpine-basierte Docker-Container
Automatisches Upgrade von Debian-Containern
Für das Verfahren müssen Sie sich um zwei Schritte kümmern:
Schritt 1:Beachten Sie die CMD-Anweisung
Notieren Sie sich die CMD-Anweisung, die final in der WebApp Dockerfile.
angegeben istDazu müssen Sie das Dockerfile überprüfen, mit dem das Image erstellt wurde (in diesem Beispiel Ghost):
Daher ist der eigentliche Befehl hier node current/index.js
.
Schritt 2:Fügen Sie die Einstellung „Auto-Upgrade“ hinzu
Fügen Sie die Upgrade-Befehle und die notierte CMD-Anweisung im Ghost-Service-Abschnitt der Docker Compose-Datei hinzu:
command: sh -c "apt update && apt -y upgrade && node current/index.js"
Mal sehen, wie das letztendlich aussehen würde. Angenommen, Sie betrachten die Docker Compose-Einträge für den Ghost-Dienst aus dem oben zitierten Leitfaden. Eine aktualisierte Version basierend auf unserem Tutorial wäre:
ghost:
image: ghost:4.20.4
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apt update && apt -y upgrade && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
Hier habe ich den Befehl direkt nach den volumes
angegeben Abschnitt.
Automatisches Upgrade von Alpine-Containern
Auch bei diesem Verfahren müssen Sie sich um zwei ähnliche Schritte kümmern:
Schritt 1:Beachten Sie die CMD-Anweisung
Notieren Sie sich die CMD-Anweisung, die final in der WebApp Dockerfile.
angegeben istDazu müssen Sie das Dockerfile (in diesem Beispiel Ghost Alpine) überprüfen:
Sehr offensichtlich ist der Befehl hier derselbe wie für die frühere Debian-Version:node current/index.js
.
Schritt 2:Fügen Sie die Einstellung „Auto-Upgrade“ hinzu
Fügen Sie die Upgrade-Befehle und die notierte CMD-Anweisung im Ghost-Service-Abschnitt der Docker Compose-Datei hinzu:
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
Alpine Upgrade-Referenz.
Mal sehen, wie das letztendlich aussehen würde (beachte dieses Mal, dass ich das Alpen-Image für Ghost verwenden werde). Angenommen, Sie betrachten die Docker Compose-Einträge für den Ghost-Dienst aus dem oben zitierten Leitfaden. Eine aktualisierte Version basierend auf unserem Tutorial wäre:
ghost:
image: ghost:4.20.4-alpine
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && node current/index.js"
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
Das ist es dann. Ab diesem Zeitpunkt werden die Container-Upgrade-Befehle automatisch aufgerufen, wenn Sie Ihre WebApps ohne Ausfallzeit aktualisieren, und dann werden Ihre Web-Apps ausgeführt.
Hinweis:Wenn Sie eine App aktualisieren, indem Sie die Versionsnummer des Bildes in der Docker-Compose-Datei ändern, müssen Sie die hier besprochene Befehlsoption mit einem Hashtag vorübergehend deaktivieren. Sobald das Update für die Web-App abgeschlossen ist, aktivieren Sie dieselbe Zeile erneut, um den Container selbst zu aktualisieren. Beide Schritte (Aktualisierung der App und des Containers) sind durch Skalierung ohne Ausfallzeiten möglich.
Bonustipps
Hier ist eine Liste von Befehlen für andere beliebte Apps wie Nextcloud und Rocket.Chat. Denken Sie daran, dass diese genau so hinzugefügt werden müssen, wie Sie es beim Ghost-Beispiel gesehen haben.
Nextcloud
Für Debian:
command: sh -c "apt update && apt -y upgrade && apache2-foreground"
Für Alpine:
command: sh -c "apk update && apk add --upgrade apk-tools && apk upgrade --available && apache2-foreground"
Rocket.Chat
command: sh -c "apt update && apt -y upgrade && node main.js"
Ich hoffe, dieser Artikel hilft Ihnen bei Ihren täglichen Sysadmin-Aktivitäten. Wenn Sie Fragen, Feedback oder Vorschläge haben, hinterlassen Sie bitte Ihre Gedanken im Kommentarbereich unten.