# Docker/Podman Composer — Anwendungsbeispiele

> Praxisnahe Durchläufe: nginx in Compose umwandeln, Volumes/Ports/Env, ein Multi-Flag-Befehl, die Gegenrichtung Compose→Run und ein podman-Beispiel.

Source: https://www.jpkc.com/db/tools/docker/examples/

Zurück zur Übersicht: [Docker/Podman Composer](https://www.jpkc.com/db/tools/docker/) · Tool live öffnen: [www.jpkc.com/tools/docker/](https://www.jpkc.com/tools/docker/)

Das [Manual](https://www.jpkc.com/db/tools/docker/manual/) erklärt beide Richtungen und alle unterstützten Flags im Detail. Diese Seite zeigt **konkrete Konvertierungen** mit Eingabe und tatsächlichem Ergebnis. Die Oberfläche ist auf Englisch — Tab- und Button-Namen stehen deshalb im Original.

## Beispiel 1: Einfacher nginx-Container (Run → Compose)

Der Klassiker — ein kurzer Run-Befehl wird zur Compose-Datei. Eingabe im Tab **Run → Compose**:

```bash
docker run -d --name web -p 8080:80 nginx:alpine
```

Nach Klick auf **Convert to YAML**:

```yaml
services:
  web:
    image: nginx:alpine
    container_name: web
    ports:
      - 8080:80
```

Beachte: Das `-d` (detach) verschwindet — in Compose ist das implizit. Der Service-Name `web` kommt aus `--name`; ohne `--name` hätte das Tool ihn aus dem Image abgeleitet (`nginx`).

## Beispiel 2: Volumes, Ports, Environment und Healthcheck

Ein realistischer Datenbank-Container mit mehreren Flag-Typen. Eingabe:

```bash
docker run -d \
  --name db \
  -e POSTGRES_PASSWORD=secret \
  -v pgdata:/var/lib/postgresql/data \
  -p 5432:5432 \
  --restart unless-stopped \
  --health-cmd "pg_isready -U postgres" \
  --health-interval 10s \
  --memory 512m \
  postgres:16
```

Ergebnis:

```yaml
services:
  db:
    image: postgres:16
    container_name: db
    restart: unless-stopped
    ports:
      - 5432:5432
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=secret
    mem_limit: 512m
    healthcheck:
      test:
        - CMD-SHELL
        - pg_isready -U postgres
      interval: 10s
```

Zwei Dinge lohnen die Aufmerksamkeit: Der `--health-cmd` wird zu einer `test`-Liste in der `CMD-SHELL`-Form, und `--memory` landet als `mem_limit`. Der per Anführungszeichen geklammerte Healthcheck-Befehl bleibt dank Tokenizer als ein Argument erhalten.

## Beispiel 3: Multi-Flag-Befehl mit kombinierten Kurz-Flags

Hier kommen kombinierte Flags und ein nachgestelltes Kommando ins Spiel. Eingabe:

```bash
docker run -it --rm -p 3000:3000 node:20 bash
```

Ergebnis:

```yaml
services:
  node:
    image: node:20
    tty: true
    stdin_open: true
    ports:
      - 3000:3000
    command: bash
```

Was hier passiert: `-it` wird in `-i` und `-t` zerlegt und ergibt `stdin_open: true` und `tty: true`. Das `--rm` wird **verworfen** (es hat keine Compose-Entsprechung), ebenso wäre ein `-d` verschwunden. Das `bash` nach dem Image-Namen wird zum `command`. Da kein `--name` gesetzt ist, leitet das Tool den Service-Namen aus dem Image ab: `node`.

## Beispiel 4: Voller Funktionsumfang (der Example-Knopf)

Der **Example**-Knopf im Run-Tab lädt einen nginx-Webserver mit fast allem auf einmal:

```bash
docker run -d \
  -p 8080:80 \
  -p 443:443 \
  -v /var/www:/usr/share/nginx/html:ro \
  -v nginx-logs:/var/log/nginx \
  -e NGINX_HOST=example.com \
  -e NGINX_PORT=80 \
  --name webserver \
  --restart unless-stopped \
  --network mynet \
  --label app=webserver \
  --label env=production \
  --memory 256m \
  --health-cmd "curl -fs http://localhost/" \
  --health-interval 30s \
  --health-retries 3 \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx:1.27-alpine
```

Ergebnis:

```yaml
services:
  webserver:
    image: nginx:1.27-alpine
    container_name: webserver
    restart: unless-stopped
    ports:
      - 8080:80
      - 443:443
    volumes:
      - /var/www:/usr/share/nginx/html:ro
      - nginx-logs:/var/log/nginx
    environment:
      - NGINX_HOST=example.com
      - NGINX_PORT=80
    networks:
      - mynet
    labels:
      - app=webserver
      - env=production
    mem_limit: 256m
    logging:
      driver: json-file
      options:
        max-size: 10m
        max-file: "3"
    healthcheck:
      test:
        - CMD-SHELL
        - curl -fs http://localhost/
      interval: 30s
      retries: 3
```

Mehrfach genannte Flags (`-p`, `-v`, `-e`, `--label`, `--log-opt`) sammeln sich zu Listen bzw. zum `logging.options`-Block. Beachte das `"3"` bei `max-file`: Der Serialisierer setzt eine reine Zahl, die als String gemeint ist, in Anführungszeichen, damit YAML sie nicht als Integer liest.

## Beispiel 5: Die Gegenrichtung — Compose → Run mit mehreren Services

Wechsle in den Tab **Compose → Run** und füge eine Compose-Datei mit zwei Services ein:

```yaml
services:
  web:
    image: nginx:alpine
    container_name: web
    ports:
      - "8080:80"
    restart: unless-stopped
  app:
    image: node:20-alpine
    container_name: app
    restart: always
    working_dir: /app
    volumes:
      - ./app:/app
    environment:
      NODE_ENV: production
      PORT: "3000"
    ports:
      - "3000:3000"
    networks:
      - mynet
    depends_on:
      - web
```

Nach **Convert to Commands** (Runtime: **docker**) entsteht je Service ein Befehl:

```bash
# web
docker run -d \
  --name web \
  --restart unless-stopped \
  -p 8080:80 \
  nginx:alpine

# app
docker run -d \
  --name app \
  --restart always \
  --workdir /app \
  -p 3000:3000 \
  -v ./app:/app \
  -e NODE_ENV=production \
  -e PORT=3000 \
  --network mynet \
  node:20-alpine
```

Wichtig: Das `depends_on: [web]` taucht im erzeugten Befehl **nicht** auf — `docker run` kennt keine Start-Abhängigkeiten, also fällt es weg. Auch eine Top-Level-`networks:`-Definition mit Treiber-Optionen würde ignoriert; nur die Service-Referenz `mynet` wird zu `--network mynet`. Das `environment`-Objekt wird zu einzelnen `-e KEY=VALUE`-Flags aufgelöst.

## Beispiel 6: Befehle für Podman erzeugen

Dieselbe Compose-Eingabe, aber im **Runtime**-Schalter **podman** gewählt. Aus dem `web`-Service wird dann:

```bash
# web
podman run -d \
  --name web \
  --restart unless-stopped \
  -p 8080:80 \
  nginx:alpine
```

Der einzige Unterschied ist das Befehlswort `podman` statt `docker` — die Flags bleiben gleich, weil Podman die `docker run`-Optionen kompatibel nachbildet. Praktisch, wenn du eine vorhandene Compose-Datei auf einem Podman-Host von Hand testen willst.

---

Noch tiefer: das [Manual](https://www.jpkc.com/db/tools/docker/manual/) für jedes Flag, die [Tipps & Tricks](https://www.jpkc.com/db/tools/docker/tips/) für die Grenzen und Kniffe. Ausprobieren kannst du alles direkt im [Tool](https://www.jpkc.com/tools/docker/).

