Anleitungen

Docker Compose für Homeserver: Von einer einzigen YAML-Datei zu sauber laufenden Diensten

Docker Compose für Homeserver: Von einer einzigen YAML-Datei zu sauber laufenden Diensten

Als ich vor einigen Jahren zum ersten Mal einen gebrauchten Laptop als Heimserver nutzte, verbrachte ich Stunden damit, sicherzustellen, dass eine Webanwendung ausgeführt werden konnte. Es gibt Befehledocker rundie fast so lang ist wie eine Mautstraße, Häfen, die man sich einzeln merken muss, und Bände, die wer weiß wo geschrieben werden. Es war, als würde man einen Kleiderschrank ohne Anleitung zusammenbauen: Jede Schraube war vorhanden, aber niemand wusste, in welcher Reihenfolge sie war.

Erst nachdem ich es erfahren habeDocker Compose, alles ändert sich. Eine Dateidocker-compose.ymlkann alle Dienstkonfigurationen erfassen, angefangen von Images, Ports, Volumes, Umgebungsvariablen bis hin zu Abhängigkeiten zwischen Containern. In diesem Artikel möchte ich mitteilen, wie ich Docker Compose auf meinem alltäglichen Heimserver verwende, von der grundlegendsten Struktur bis hin zu den kleinen Macken, die das Leben einfacher machen.

Warum Docker Compose, nicht normales Docker?

Führen Sie Container mit Befehlen ausdocker runEs ist, als würde man mit einem Rezept kochen, das man nur im Kopf hat. Wenn Sie ein Gewürz vergessen, werden die Ergebnisse anders ausfallen. Wenn Sie das Rezept mit einem anderen Computer teilen möchten, müssen Sie den Befehl von Grund auf neu schreiben. Docker Compose wandelt dieses Rezept in ein Standarddokument um: eine Dateidocker-compose.yml.

Stellen Sie sich vor, Sie verfügen über einen dreischichtigen Dienst: Webanwendung, Datenbank und Reverse-Proxy. Bei Docker müssen Sie drei Befehle ausführendocker runAnders, erstellen Sie ein manuelles Netzwerk und beten Sie dann, dass alle miteinander kommunizieren können. Mit Docker Compose nur eine Datei, dann ein Befehl:docker compose up -d. Alle Container befinden sich in einem Projekt, einem virtuellen Netzwerk und einem Regelsatz.

Darüber hinaus macht Docker Compose den Update-Prozess übersichtlicher. Möchten Sie die Bildversion ändern? Ändern Sie eine Zeile in der Datei und führen Sie sie dann ausdocker compose up -dWieder. Bereits laufende Container werden aktualisiert, ohne dass Sie sich eine Befehlsfolge merken müssen. Deshalb halte ich Docker Compose für eine obligatorische Grundlage für jeden, der ernsthaft einen Heimserver aufbauen möchte.

Die Struktur der Datei docker-compose.yml, die ich am häufigsten verwende

Docker Compose-Dateien werden im YAML-Format geschrieben. YAML ist einrückungssensitiv, sodass ein falsches Leerzeichen dazu führen kann, dass die gesamte Datei abgelehnt wird. Normalerweise verwende ich zwei Leerzeichen für jede Einrückungsebene. Auch wenn es trivial erscheint, bewahrt mich diese Angewohnheit vor vielen Fehlern mitten in der Nacht.

Hier ist die einfachste Vorlage, die ich in fast jedem Projekt verwende:

version: "3.8"

services:
  app:
    image: nginx:alpine
    container_name: app_web
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    environment:
      - NGINX_HOST=app.lan
    networks:
      - app_net

networks:
  app_net:
    driver: bridge

Hier gibt es mehrere wichtige Teile. TeilservicesDefiniert den Container, der ausgeführt wird. Jeder Dienst verfügt über einen Namen, ein Bild und andere Konfigurationen.container_nameerleichtert es uns, Container zu erkennen, wenn wir sie sehendocker ps.restart: unless-stoppedDas bedeutet, dass der Container nach dem Neustart wieder zum Leben erwacht, sofern wir ihn nicht manuell herunterfahren.

TeilportsVerbinden des Host-Ports mit dem Container-Port. Das Format istHOST:CONTAINER. Also8080:80Dies bedeutet, dass der Datenverkehr auf Port 8080 des Host-Computers an Port 80 innerhalb des Containers weitergeleitet wird. Teilvolumessorgt dafür, dass die Daten im Container auch dann bestehen bleiben, wenn der Container gelöscht wird. Im Beispiel oben: Ordner./htmlim Host installiert/usr/share/nginx/htmlim Container im schreibgeschützten Modus.

Reales Beispiel: Ausführen von Kuma Uptime mit einem Befehl

Als Übung möchte ich Ihnen zeigen, wie Sie Uptime Kuma ausführen, ein Überwachungstool, das ich schon oft besprochen habe. Dieses Tool ist leicht, nützlich und perfekt, um zu verstehen, wie Docker Compose in der Praxis funktioniert.

Erstellen Sie zunächst einen neuen Ordner und gehen Sie hinein:

mkdir -p ~/compose/uptime-kuma
cd ~/compose/uptime-kuma

Dann erstellen Sie eine Dateidocker-compose.ymlmit folgendem Inhalt:

version: "3.8"

services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    restart: unless-stopped
    ports:
      - "3001:3001"
    volumes:
      - ./data:/app/data
    environment:
      - TZ=Asia/Jakarta

networks:
  default:
    name: uptime-kuma-net

Sobald die Datei gespeichert ist, führen Sie Folgendes aus:

docker compose up -d

Befehlupliest die Datei, lädt das Bild herunter, falls es noch nicht vorhanden ist, erstellt einen Container und führt ihn aus. Option-dDas bedeutet getrennt, sodass unser Terminal nicht im Protokollcontainer gefangen ist. Wenige Sekunden später ist Kuma Uptime unter erreichbarhttp://localhost:3001.

Wenn Sie den Dienst zu irgendeinem Zeitpunkt beenden möchten, führen Sie ihn einfach ausdocker compose down. Dieser Befehl stoppt und löscht den Container, jedoch nicht die Daten im Ordner./datableibt sicher, da es auf dem Host gespeichert wird. Wenn Sie das Protokoll sehen möchten,docker compose logs -fzeigt Protokolle aller Dienste in Echtzeit an.

Tipps zum Verwalten von Volume-, Netzwerk- und Neustartrichtlinien

Meiner Erfahrung nach frustrieren Anfänger am häufigsten drei Dinge: Beim Löschen von Containern gehen Daten verloren, Container können nicht miteinander kommunizieren und Dienste werden nach einem Neustart nicht wieder gestartet. Glücklicherweise gibt es für alle drei Probleme einfache Lösungen in Docker Compose.

Volumenist der Schlüssel, damit Daten nicht verschwinden. Es gibt zwei gängige Methoden: Mount und benanntes Volume binden. Bind Mount mountet den Host-Ordner direkt im Container, geeignet für häufig bearbeitete Konfigurationsdateien. Benannte Volumes werden von Docker selbst verwaltet, was für die Datenbank einfacher ist. Beispiel für ein benanntes Volume:

volumes:
  db_data:

services:
  db:
    image: postgres:15-alpine
    volumes:
      - db_data:/var/lib/postgresql/data

NetzwerkMachen Sie Container in einem Projekt in der Lage, sich gegenseitig über den Dienstnamen aufzurufen. Wenn Sie also über einen Webdienst und einen Datenbankdienst verfügen, können Sie vom Webcontainer aus über den Hostnamen auf die Datenbank zugreifendb. Docker Compose erstellt automatisch eine Netzwerkbrücke für jedes Projekt, sodass wir uns keine Gedanken über IP-Adressen machen müssen.

Richtlinie neu startenbestimmt, was passiert, wenn der Container stoppt. Ich benutze es am häufigstenunless-stoppedfür Dienste, die immer eingeschaltet sein müssen, wie z. B. Überwachung oder Reverse-Proxy. Andere Optionen wiealwaysoderon-failurees gibt auch, aberunless-stoppedgibt uns manuelle Kontrolle beim Debuggen.

Wann sollten Sie aktualisieren und ein Backup durchführen?

Das Aktualisieren von Bildern in Docker Compose ist sehr einfach, aber das bedeutet nicht, dass es jeden Tag durchgeführt werden muss. Ich habe die Angewohnheit, einmal pro Woche nach Bildaktualisierungen zu suchen und diese dann zunächst bei unkritischen Diensten zu testen. Die Methode:

docker compose pull
docker compose up -d

BefehlpullLaden Sie die neueste Image-Version entsprechend dem in der Datei angegebenen Tag herunter. Danach,up -derstellt den Container mit dem neuen Bild neu. Wenn ein Problem auftritt, können wir die alten Tags in der Datei schnell wiederherstellen und dann ausführenup -dWieder.

Für Backups ist der Volume-Ordner das Wichtigste. Normalerweise erstelle ich Archive aus dem Projektordner und seinen Volumes. Zum Beispiel für das Kuma Uptime-Projekt oben:

tar -czvf uptime-kuma-backup-$(date +%F).tar.gz ~/compose/uptime-kuma

Dieses Backup umfasst Dateiendocker-compose.yml, Konfigurations- und Anwendungsdaten. Später extrahieren wir einfach das Archiv und führen es ausdocker compose up -dauf einem anderen Computer. Das ist eine der Schönheiten von Docker Compose: Unsere Dienste werden portabel, wie ein ordentlich gepackter Koffer.

Abschluss

Docker Compose hat meine Sicht auf Heimserver verändert. Was zunächst manuell und zerbrechlich war, wurde strukturierter, einfacher zu sichern und leichter zu bewegen. Eine YAML-Datei mag einfach aussehen, aber sie ist die Blaupause für das gesamte Service-Ökosystem, das wir aufbauen.

Wenn Sie gerade erst anfangen, empfehle ich Ihnen, das obige Kuma Uptime-Beispiel auszuprobieren. Von dort aus können Sie mit dem Hinzufügen von Datenbanken, Reverse-Proxys oder anderen selbst gehosteten Anwendungen experimentieren. Das Wichtigste ist nicht, sich jeden Befehl zu merken, sondern das Muster zu verstehen: Dienst definieren, Volume mounten, Netzwerk einrichten und dann ausführen.

Wenn es Teile gibt, die immer noch verwirrend sind, zögern Sie nicht, in der Kommentarspalte zu schreiben. Außerdem lerne ich immer noch, und oft entstehen die größten Fehler, wenn man mitten in der Nacht neue Dinge ausprobiert.