Zum Inhalt springen
labkompass

Command Builder · Docker

Docker Compose Generator

Eine compose.yaml für einen Dienst, ohne die Einrückung selbst hinzubekommen: Image mit fester Version, Ports, Volumes, Netzwerk, Healthcheck und auf Wunsch Ressourcenlimits und Härtung. Passwörter landen getrennt in einer .env-Datei. Alles entsteht im Browser — gespeichert oder übertragen wird nichts.

Vorlage übernehmen:

Name des Dienstes in der Datei — kurz, klein geschrieben.

Feste Version statt latest — Updates passieren dann nur, wenn du den Tag änderst.

Leer lassen ist meist besser: Compose vergibt eindeutige Namen selbst.

Optionen

Ports

Schema Host-Port:Container-Port — 8080:80 macht Port 80 des Containers auf dem Server als 8080 erreichbar.

Volumes

Named Volumes verwaltet Docker selbst, Bind Mounts binden einen Ordner des Servers ein — relative Pfade wie ./html gelten ab dem Ordner der compose.yaml.

Umgebungsvariablen

Konfiguration des Images über Variablen — welche es gibt, steht in der Doku des jeweiligen Images.

Erweiterte Optionen▾

Ports ohne Host-IP lauschen auf allen Schnittstellen — und Docker-Portfreigaben umgehen Firewall-Regeln von ufw oder firewalld.

Empfehlung: Für Dienste hinter einem Reverse Proxy 127.0.0.1 oder die LAN-IP des Servers als Host-IP eintragen.

Generierte Datei

services:
  web:
    image: nginx:1.30-alpine
    restart: unless-stopped
    ports:
      - "8080:80"
    volumes:
      - "./html:/usr/share/nginx/html:ro"
    environment:
      TZ: Europe/Berlin
    security_opt:
      - "no-new-privileges:true"
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

Das bedeuten die Parameter

services
Unter services steht jeder Dienst mit seinem Namen. Über diesen Namen erreichen sich Container im selben Netzwerk gegenseitig.
image
Das Image ist die Vorlage, aus der der Container entsteht — ohne Registry-Angabe kommt es von Docker Hub.
restart
Startet nach Absturz und Reboot neu — außer du hast den Container bewusst gestoppt.
ports
Schema Host-Port:Container-Port — 8080:80 macht Port 80 des Containers auf dem Server als 8080 erreichbar. Dienste, die nur andere Container erreichen müssen (Datenbanken), brauchen gar keine Portfreigabe.
volumes
Named Volumes verwaltet Docker selbst, Bind Mounts binden einen Ordner des Servers ein — relative Pfade wie ./html gelten ab dem Ordner der compose.yaml. Alles, was nicht in einem Volume liegt, ist beim Neuerstellen des Containers weg.
environment
Konfiguration des Images über Variablen — welche es gibt, steht in der Doku des jeweiligen Images.
security_opt
Verhindert, dass Prozesse im Container über setuid-Programme mehr Rechte bekommen, als sie beim Start hatten.
logging
Ohne Limit wachsen Container-Logs unbegrenzt; so behält Docker höchstens drei Dateien à 10 MB.

So nutzt du die Datei

Lege auf dem Server einen Ordner pro Dienst an, zum Beispiel /opt/web, und speichere dort die compose.yaml — bei ausgelagerten Passwörtern daneben die .env. Vor dem ersten Start prüft docker compose config --quiet, ob die Datei gültig ist; ohne Ausgabe ist alles in Ordnung. Danach startet docker compose up -d den Dienst im Hintergrund. In Portainer fügst du denselben Inhalt als Stack im Web-Editor ein.

Warum eine feste Version statt latest?

latest ist kein „neuestes stabiles Release“, sondern nur ein Tag, den der Herausgeber beliebig verschieben kann. Wer ihn nutzt, bekommt beim nächsten pull womöglich eine neue Hauptversion mit geänderter Konfiguration. Mit einem festen Tag passiert ein Update erst, wenn du ihn bewusst änderst — und ein Rückweg ist dann einfach der alte Tag.

Named Volume oder Bind Mount?

Ein Named Volume verwaltet Docker selbst unter /var/lib/docker/volumes; das ist der unkomplizierte Standard für Anwendungsdaten. Ein Bind Mount bindet einen Ordner deiner Wahl ein — praktisch für Konfigurationsdateien, die du selbst bearbeitest. Dann müssen Besitzer und Rechte des Ordners zum Benutzer im Container passen.

Alle Optionen im Überblick

OptionBedeutungErklärung
servicesDienstnameUnter services steht jeder Dienst mit seinem Namen. Über diesen Namen erreichen sich Container im selben Netzwerk gegenseitig.
imageImageDas Image ist die Vorlage, aus der der Container entsteht — ohne Registry-Angabe kommt es von Docker Hub.
container_nameContainername (optional)Ein fester Containername ist bequem in Befehlen wie docker logs, verhindert aber, dass der Dienst mehrfach laufen kann.
·unless-stopped (empfohlen)Startet nach Absturz und Reboot neu — außer du hast den Container bewusst gestoppt.
·alwaysStartet immer neu, auch nach einem manuellen Stopp, sobald Docker neu startet.
·on-failureStartet nur neu, wenn der Prozess mit einem Fehlercode endet — gut für Jobs, die sauber fertig werden dürfen.
portsPortsSchema Host-Port:Container-Port — 8080:80 macht Port 80 des Containers auf dem Server als 8080 erreichbar. Dienste, die nur andere Container erreichen müssen (Datenbanken), brauchen gar keine Portfreigabe.
volumesVolumesNamed Volumes verwaltet Docker selbst, Bind Mounts binden einen Ordner des Servers ein — relative Pfade wie ./html gelten ab dem Ordner der compose.yaml. Alles, was nicht in einem Volume liegt, ist beim Neuerstellen des Containers weg.
environmentUmgebungsvariablenKonfiguration des Images über Variablen — welche es gibt, steht in der Doku des jeweiligen Images.
.envGeheimnisse in .env auslagernCompose liest die .env im selben Ordner automatisch und setzt die Werte ein. So kann die compose.yaml ins Git, die .env nicht.
·Benanntes Netzwerk anlegenLegt ein eigenes Netzwerk an. Dienste darin finden sich über ihren Dienstnamen per DNS.
·Vorhandenes Netzwerk nutzen (z. B. Reverse Proxy)external: true hängt den Dienst an ein Netzwerk, das schon existiert — typischerweise das Netz des Reverse Proxys.
·hostDer Container nutzt direkt den Netzwerk-Stack des Servers — ohne Portweiterleitung. ⚠ Mit network_mode: host ist jeder Port des Dienstes direkt auf dem Server offen; Portfreigaben werden ignoriert.
internalIntern (kein Zugriff nach außen)internal: true schneidet das Netzwerk vom Internet ab — sinnvoll für Datenbanken, die nur mit der eigenen App sprechen.
healthcheckHealthcheck hinzufügenDocker führt den Test regelmäßig im Container aus; docker ps zeigt dann healthy oder unhealthy statt nur „läuft“. Der Befehl muss im Image vorhanden sein — Alpine-Images haben wget, viele Debian-Images curl, minimalistische Images oft gar nichts.
mem_limitArbeitsspeicher-LimitObergrenze für den RAM des Containers — überschreitet er sie, beendet der Kernel den Prozess, statt den ganzen Server auszubremsen.
cpusCPU-LimitWie viele CPU-Kerne der Container höchstens nutzen darf, z. B. 1.5.
userBenutzer (UID:GID)Lässt den Prozess als normalen Benutzer statt als root laufen — Bind-Mount-Ordner müssen dann diesem Benutzer gehören.
read_onlyDateisystem schreibgeschütztDer Container kann nur noch in Volumes schreiben. Viele Images brauchen dann zusätzlich ein beschreibbares /tmp (tmpfs). ⚠ Nicht jedes Image startet mit schreibgeschütztem Dateisystem.
cap_dropAlle Linux-Capabilities entziehenCapabilities sind Teilrechte von root (z. B. Ports unter 1024 öffnen). ALL entzieht alle — fehlt dem Dienst etwas, gezielt per cap_add zurückgeben.
security_optKeine Rechteausweitung (no-new-privileges)Verhindert, dass Prozesse im Container über setuid-Programme mehr Rechte bekommen, als sie beim Start hatten.
loggingLog-Größe begrenzen (3 × 10 MB)Ohne Limit wachsen Container-Logs unbegrenzt; so behält Docker höchstens drei Dateien à 10 MB.

Häufige Fragen

Ist die erzeugte compose.yaml gültig?

Die Ausgabe folgt der Compose-Spezifikation und wird in den Tests gegen einen YAML-Parser geprüft; die Vorlagen wurden zusätzlich mit docker compose config validiert. Ob ein Image mit den gewählten Ports, Pfaden und Variablen funktioniert, hängt vom Image ab — dessen Dokumentation sagt, welche Pfade und Variablen es erwartet.

Wo bleiben meine Passwörter?

Nirgends außer in deinem Browser. Werte von Variablen landen weder in der Adresszeile noch auf einem Server. Mit „Geheimnisse in .env auslagern“ stehen sie zudem nicht in der compose.yaml, sondern nur in der separaten .env, die nicht ins Git-Repository gehört.

Warum fehlt das version:-Feld?

Weil aktuelle Compose-Versionen es nicht mehr auswerten und beim Start eine Warnung ausgeben, wenn es gesetzt ist. Die Datei beginnt deshalb direkt mit services:.

Kann ich mehrere Dienste in eine Datei schreiben?

Der Generator erzeugt einen Dienst. Weitere Dienste fügst du unter services: auf derselben Einrückungsebene an; gemeinsame Netzwerke und Volumes stehen jeweils nur einmal am Ende der Datei.

Passende Tools

Passende Guides