
Pipeline zum Deployen von Docker-Containern auf einem VPS erstellen

In diesem Tutorial möchte ich dir einen kostenlosen und praktischen Weg zeigen, wie du automatisch neue Versionen deiner dockerisierten Anwendungen mit einem einfachen git push
-Befehl auf einem virtuellen privaten Server (VPS) bereitstellen kannst.
Wir werden GitHub Actions verwenden, um das Docker-Image zu erstellen, es in der GitHub Container Registry (GHCR) zu speichern und es mit Watchtower auf unserem VPS zu pullen.
Ich gehe davon aus, dass du bereits Zugriff auf einen VPS hast, auf dem Docker installiert ist. Wenn du einen günstigen VPS-Anbieter suchst, empfehle ich dir, den verlinkten Artikel anzuschauen. Um Docker zu installieren, folge einfach den Anweisungen auf der offiziellen Website.
Wenn du nur eine kostengünstige Möglichkeit suchst, deine Container bereitzustellen, empfehle ich dir unseren Dienst sliplane.io
Los geht's!

Erstelle einen Personal Access Token in GitHub
Die GitHub Container Registry (GHCR) ist eine kostenlose Möglichkeit, private Docker-Images zu speichern. Um darauf zuzugreifen, müssen wir zuerst einen Personal Access Token erstellen.
- Gehe zu den Entwicklereinstellungen in GitHub
- Klicke auf Generate new token und wähle Generate new token (classic).
- Gib dem Token einen aussagekräftigen Namen, setze ein Ablaufdatum und wähle die Berechtigung write:packages. Generiere den Token und kopiere ihn, da du ihn nur einmal sehen wirst.
Ausführlichere Anweisungen findest du in diesem Artikel von Github.
Erstelle einen GitHub Actions Deploy Workflow
Wir können GitHub Actions verwenden, um unser Docker-Image zu erstellen und es zu GHCR zu pushen. Erstelle im Repository, das du deployen möchtest, eine Datei namens release.yml im Ordner .github/workflows.
.
├── .github/
│ └── workflows/
│ └── release.yml
└── ...
Kopiere das folgende Skript in die Datei release.yml und aktualisiere den project-name in Schritt 3 und 4. GitHub wird diesen Workflow bei jedem neuen Push zum main-Branch automatisch ausführen.
name: Build and Push Docker Image
on:
push:
branches:
- main
jobs:
build-and-push-to-ghcr:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.PAT }}
- name: Build Docker image
run: |
docker build -t ghcr.io/${{ github.repository_owner }}/project-name:latest .
- name: Push Docker image
run: |
docker push ghcr.io/${{ github.repository_owner }}/project-name:latest
Bevor du dieses Skript ausführen kannst, musst du den Personal Access Token in deinem Repository speichern. Gehe auf deine Repository-Seite, klicke auf Settings > Secrets and variables > Actions, füge ein neues Secret mit dem Namen PAT hinzu und füge deinen zuvor erstellten Access Token als Wert ein.
Watchtower einrichten
Watchtower ist ein Dienst, der kontinuierlich die zugrunde liegenden Images deiner laufenden Container abruft und sie mit den verwendeten Images vergleicht. Wenn sich der Inhalt eines abgerufenen Images von dem verwendeten unterscheidet, wird der Container mit dem neuen Image neu gestartet.
SSH auf deinen VPS:
ssh root@DEINEVPSIP
Starte Watchtower, indem du einfach den Watchtower Docker-Container ausführst:
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e REPO_USER="dein-github-username" \
-e REPO_PASS="dein-github-pat" \
containrrr/watchtower \
--interval 300
Watchtower bezieht Informationen über laufende Container aus der Datei docker.sock
, die in einem Volume gemountet wird. Standardmäßig werden alle laufenden Container überwacht, aber du kannst die Überwachung auf bestimmte Container beschränken:
docker run -d \
--name watchtower \
-v /var/run/docker.sock:/var/run/docker.sock \
-e REPO_USER="dein-github-username" \
-e REPO_PASS="dein-github-pat" \
containrrr/watchtower \
containername1 containername2 containername3 \
--interval 300
Die Umgebungsvariablen REPO_USER
und REPO_PASS
können zur Authentifizierung beim Abruf aus privaten Registrys verwendet werden. Du kannst auch docker login
ausführen, um deine Zugangsdaten in $HOME/.docker/config.json zu speichern, und dann diese Konfigurationsdatei mounten, um dem Watchtower-Container Authentifizierungsdaten bereitzustellen:
docker run -d \
--name watchtower \
-v $HOME/.docker/config.json:/config.json \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--interval 300
Der Flag --interval
gibt an, wie oft neue Versionen abgerufen werden, in diesem Fall alle 300 Sekunden / 5 Minuten.
Watchtower kann ziemlich bandbreitenintensiv sein. Stelle sicher, dass du ihn so einrichtest, dass er nur die benötigten Container überwacht und setze das Intervall entsprechend deinen Bedürfnissen.
Wenn du ein Repository zum ersten Mal deployen möchtest, musst du das Image einmal manuell pullen und ausführen. Melde dich bei GHCR an mit:
docker login ghcr.io -u BENUTZERNAME --password-stdin
und verwende den Personal Access Token zur Authentifizierung.
Pulle dein Image mit:
docker pull ghcr.io/NAMESPACE/IMAGE_NAME
Und führe es aus mit:
docker run IMAGENAME
Sobald es läuft, wird Watchtower automatisch neue Versionen von GHCR abrufen.
Zusammenfassung
Du kannst schnell eine Deploy-Pipeline erstellen, indem du diese Schritte befolgst:
- Richte einen VPS ein und installiere Docker
- Erstelle einen PAT in GitHub, um auf die Container Registry zuzugreifen
- Erstelle einen Release-Workflow, der dein Docker-Image baut und auf GHCR veröffentlicht
- Führe Watchtower aus, um neue Versionen deiner laufenden Container automatisch mit GHCR zu synchronisieren
Wie kann man dieses Setup verbessern? Natürlich ist dies nur der Ausgangspunkt für deine Container-Deployment-Pipeline. Du kannst dieses Setup verbessern, indem du eine Möglichkeit hinzufügst, automatisch Domain-Einträge hinzuzufügen, Secrets zu verwalten, Logs und Monitoring-Daten anzuzeigen und vieles mehr... Wenn du dir etwas Ärger ersparen möchtest, schau dir unseren Service sliplane.io an, der mit all diesen Funktionen von Haus aus kommt.