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
| Option | Bedeutung | Erklärung |
|---|---|---|
services | Dienstname | Unter services steht jeder Dienst mit seinem Namen. Über diesen Namen erreichen sich Container im selben Netzwerk gegenseitig. |
image | Image | Das Image ist die Vorlage, aus der der Container entsteht — ohne Registry-Angabe kommt es von Docker Hub. |
container_name | Containername (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. |
· | always | Startet immer neu, auch nach einem manuellen Stopp, sobald Docker neu startet. |
· | on-failure | Startet nur neu, wenn der Prozess mit einem Fehlercode endet — gut für Jobs, die sauber fertig werden dürfen. |
ports | 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 | 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 | Umgebungsvariablen | Konfiguration des Images über Variablen — welche es gibt, steht in der Doku des jeweiligen Images. |
.env | Geheimnisse in .env auslagern | Compose liest die .env im selben Ordner automatisch und setzt die Werte ein. So kann die compose.yaml ins Git, die .env nicht. |
· | Benanntes Netzwerk anlegen | Legt 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. |
· | host | Der 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. |
internal | Intern (kein Zugriff nach außen) | internal: true schneidet das Netzwerk vom Internet ab — sinnvoll für Datenbanken, die nur mit der eigenen App sprechen. |
healthcheck | Healthcheck hinzufügen | Docker 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_limit | Arbeitsspeicher-Limit | Obergrenze für den RAM des Containers — überschreitet er sie, beendet der Kernel den Prozess, statt den ganzen Server auszubremsen. |
cpus | CPU-Limit | Wie viele CPU-Kerne der Container höchstens nutzen darf, z. B. 1.5. |
user | Benutzer (UID:GID) | Lässt den Prozess als normalen Benutzer statt als root laufen — Bind-Mount-Ordner müssen dann diesem Benutzer gehören. |
read_only | Dateisystem schreibgeschützt | Der 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_drop | Alle Linux-Capabilities entziehen | Capabilities sind Teilrechte von root (z. B. Ports unter 1024 öffnen). ALL entzieht alle — fehlt dem Dienst etwas, gezielt per cap_add zurückgeben. |
security_opt | Keine Rechteausweitung (no-new-privileges) | Verhindert, dass Prozesse im Container über setuid-Programme mehr Rechte bekommen, als sie beim Start hatten. |
logging | Log-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
Docker Run Command Builder →
docker run mit Ports, Volumes und Umgebungsvariablen zusammenstellen — als Befehl oder fertige compose.yaml.
Portainer-Installationsassistent →
Portainer auf Debian oder Ubuntu einrichten: Schritte, compose.yaml, Agent-Befehl und Sicherheitscheckliste — passend für LAN, VPN oder Reverse Proxy.
Passende Guides
Docker
Docker Grundlagen: Container, Images, Volumes und Netzwerke
Docker von Grund auf: Image und Container, Lebenszyklus, Volumes, Ports, Netzwerke und Umgebungsvariablen – mit getesteten Befehlen und einem Compose-Beispiel.
Netzwerk
Pi-hole mit Docker Compose betreiben
Pi-hole als Container statt als Systeminstallation: eine nachvollziehbare compose.yaml, der Umgang mit belegtem Port 80, ein Speicherlimit für kleine Geräte und die Frage, welchen Upstream-DNS du eintragen solltest.
Selfhosting
Uptime Kuma + Beszel: Der kostenlose Monitoring-Stack fürs Homelab
Zwei leichtgewichtige Tools, die zusammen 90 % des Homelab-Monitorings abdecken: Uptime Kuma für Dienste und SSL, Beszel für CPU, RAM, Disks und Docker — mit Compose-Setup und Alarm-Strategie.