Warum Compose statt langer docker-run-Befehle?
Ein docker run mit Ports, Volumes und Variablen ist schnell ausprobiert, aber schwer zu pflegen: Beim nächsten Update müssen Sie den Befehl wiederfinden und exakt gleich erneut eingeben. Eine compose.yaml hält dieselbe Konfiguration als Datei fest. Sie lässt sich versionieren, kommentieren und mit einem Befehl starten, aktualisieren oder entfernen. Mehrere Container eines Projekts landen automatisch in einem gemeinsamen Netz und erreichen sich dort über ihre Dienstnamen. Wie Sie solche Stacks aufbauen, zeigt die Anleitung Docker Compose: Multi-Container-Stacks aufbauen.
Das Tool oben liest Ihren Befehl mit einem eigenen Shell-Parser: Anführungszeichen, Backslash-Fortsetzungen, sudo und docker container run werden verstanden, aber nichts wird ausgeführt und keine Variable ersetzt. Optionen, für die es keine sichere Entsprechung gibt, verschwinden nicht stillschweigend, sondern erscheinen in der Zuordnungstabelle als „nicht übernommen“.
So werden die Optionen übersetzt
| docker run | compose.yaml |
|---|---|
--name web | Dienstname web und container_name: web |
-p 8080:80 | ports: - "8080:80" |
-v daten:/data | volumes: - "daten:/data" und Eintrag unter volumes: auf oberster Ebene |
-e TZ=Europe/Berlin | environment: - TZ=Europe/Berlin |
--restart unless-stopped | restart: unless-stopped |
--network proxy | networks: - proxy, oben als external: true |
--network host | network_mode: host |
-it | stdin_open: true und tty: true |
--memory 512m, --cpus 1.5 | mem_limit: "512m", cpus: 1.5 |
--health-cmd "…" | healthcheck: test: ["CMD-SHELL", "…"] |
--gpus all | deploy.resources.reservations.devices mit count: all |
-d, --rm | kein Gegenstück – gestartet wird mit docker compose up -d |
Befehl und Argumente hinter dem Image übernimmt das Tool als Liste in command:. Das entspricht genau dem Verhalten von docker run, bei dem die Argumente ohne Shell an den Container gehen.
Stolperfallen beim Umstieg
Ports immer als Zeichenkette. Parser nach YAML 1.1 lesen Werte wie 22:22 als Zahl zur Basis 60. Die Compose-Dokumentation empfiehlt deshalb, Portangaben in Anführungszeichen zu setzen. Das Tool quotet außerdem Werte wie no, on oder 1000:1000, die YAML sonst als Wahrheitswert oder Zahl deuten könnte.
Dollarzeichen. Compose ersetzt $VAR und ${VAR} beim Start durch Werte aus der Shell oder aus einer .env-Datei im Projektordner. Ein wörtliches $, etwa in einem Passwort-Hash für Traefik, muss als $$ geschrieben werden. Stand es im Befehl in einfachen Anführungszeichen, erledigt das Tool die Verdopplung automatisch.
Benannte Volumes. Compose stellt dem Volume-Namen den Projektnamen voran. Aus portainer_data wird zum Beispiel projekt_portainer_data – ein neues, leeres Volume. Soll ein bestehendes Volume aus docker run weiterverwendet werden, ergänzen Sie auf oberster Ebene name: portainer_data oder external: true.
Pfade und Netze. Relative Pfade wie ./daten gelten relativ zum Ordner der compose.yaml; $(pwd) ersetzt das Tool deshalb durch .. Benutzerdefinierte Netze trägt es als external: true ein, weil sie bei docker run bereits existieren müssen. Soll Compose das Netz selbst anlegen, entfernen Sie diese Zeile.
Keine version-Zeile. Die Compose-Spezifikation wertet version: nicht mehr aus, aktuelle Versionen von Docker Compose weisen nur noch darauf hin. Das Tool lässt die Zeile weg.
Prüfen und starten Sie die erzeugte Datei im Projektordner so:
docker compose config # Datei prüfen und aufgelöst anzeigen
docker compose up -d # Dienste im Hintergrund starten
docker compose logs -f # Protokolle verfolgen
Hinweise zu Healthchecks, Secrets und Containern ohne Root-Rechte finden Sie in Docker Compose absichern. Die YAML-Syntax einer bestehenden Datei prüft der YAML-Validator.
Häufige Fragen
Heißt die Datei compose.yaml oder docker-compose.yml?
Beides funktioniert. Die Compose-Spezifikation bevorzugt compose.yaml; Docker Compose findet im Projektordner aber auch compose.yml, docker-compose.yaml und docker-compose.yml.
Wie ersetze ich einen laufenden Container durch den Compose-Dienst?
Stoppen und entfernen Sie den alten Container mit docker stop name und docker rm name. Bind-Mounts und benannte Volumes bleiben dabei erhalten. Achten Sie auf den Projektnamen-Präfix bei benannten Volumes (siehe oben) und starten Sie danach mit docker compose up -d. Solange der alte Container existiert, scheitert der Start an einem bereits vergebenen container_name.
Sollte ich container_name überhaupt setzen?
Er ist praktisch, wenn Skripte oder andere Werkzeuge den Container unter einem festen Namen ansprechen. Nachteil: Ein Dienst mit festem container_name lässt sich nicht auf mehrere Container skalieren. Innerhalb des Projekts erreichen sich Dienste ohnehin über ihren Dienstnamen. Sie können die Übernahme oben abschalten.
Funktioniert die Datei in Portainer und im Synology Container Manager?
Ja, beide verarbeiten Compose-Dateien: in Portainer als Stack, im Container Manager als Projekt. Relative Pfade wie ./daten funktionieren dort nicht immer wie erwartet – verwenden Sie im Zweifel absolute Pfade auf dem Host. Schritt für Schritt: Portainer auf dem Synology NAS installieren und Container Manager: Compose-Projekt auf dem Synology NAS.
Werden meine Befehle oder Passwörter übertragen?
Nein. Die Umwandlung läuft vollständig in Ihrem Browser, nichts wird gesendet oder gespeichert – auch nicht in der Adresszeile. Trotzdem gilt: Passwörter gehören in Compose besser in eine .env-Datei oder in Secrets als direkt in die compose.yaml.