Loading...
Pipeline zum Deployen von Docker-Containern auf einem VPS erstellen

Pipeline zum Deployen von Docker-Containern auf einem VPS erstellen

Lukas Mauser - Co-Founder von sliplane.ioLukas Mauser
6 min

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.

  1. Gehe zu den Entwicklereinstellungen in GitHub
  2. Klicke auf Generate new token und wähle Generate new token (classic).
  3. 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:

  1. Richte einen VPS ein und installiere Docker
  2. Erstelle einen PAT in GitHub, um auf die Container Registry zuzugreifen
  3. Erstelle einen Release-Workflow, der dein Docker-Image baut und auf GHCR veröffentlicht
  4. 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.

Willkommen in der Container-Cloud

Sliplane macht es einfach, Container in der Cloud zu deployen und bei Bedarf zu skalieren. Probier es jetzt aus!