Zum Inhalt

Port-Strategie

Ziel

Diese Seite erklärt, wie Docker-Dienste auf lokale Ports gelegt werden, damit Nginx als Reverse Proxy die öffentlichen Anfragen sauber weiterleiten kann.

Die Anleitung ist allgemein verwendbar. Immohai dient als konkretes Praxisbeispiel.

Grundprinzip

Wenn Nginx als Reverse Proxy verwendet wird, soll Nginx die öffentlichen Ports übernehmen:

Port Zweck
80 HTTP
443 HTTPS

Docker-Container sollen diese Ports nicht direkt öffentlich belegen.

Falsch für Reverse-Proxy-Betrieb:

ports:
  - "80:80"

Besser:

ports:
  - "127.0.0.1:8200:80"

Damit ist der Container nur lokal auf dem Server erreichbar.

Warum lokale Ports wichtig sind

Lokale Ports verbessern Sicherheit und Wartbarkeit.

Entscheidung Begründung
127.0.0.1 verwenden Dienst ist nur lokal auf dem Server erreichbar
keine Container direkt auf 0.0.0.0:80 Nginx kann Port 80 übernehmen
klare Portbereiche definieren mehrere Apps bleiben übersichtlich
Ports dokumentieren spätere Fehleranalyse wird einfacher

Unterschied zwischen 0.0.0.0 und 127.0.0.1

Bind-Adresse Bedeutung
0.0.0.0 Dienst ist auf allen Netzwerkinterfaces erreichbar
127.0.0.1 Dienst ist nur lokal auf dem Server erreichbar

Für Docker-Dienste hinter Nginx wird empfohlen:

127.0.0.1:<lokaler-port>:<container-port>

Empfohlene Portbereiche

Für mehrere Apps sollte eine klare Port-Strategie verwendet werden.

Bereich Zweck
8100–8199 Developer Playbook
8200–8299 App 1
8300–8399 App 2
8400–8499 App 3
8500–8599 App 4

Beispiel:

127.0.0.1:8100 → Developer Playbook
127.0.0.1:8200 → App 1
127.0.0.1:8201 → Dokumentation App 1
127.0.0.1:8300 → App 2
127.0.0.1:8301 → Dokumentation App 2

Allgemeines Docker-Compose-Muster

Beispiel für eine Webapp:

services:
  web:
    image: nginx:latest
    container_name: app1-web
    restart: unless-stopped
    ports:
      - "127.0.0.1:8200:80"

Beispiel für eine Dokumentation mit MkDocs:

services:
  docs:
    image: squidfunk/mkdocs-material:latest
    container_name: app1-docs
    restart: unless-stopped
    ports:
      - "127.0.0.1:8201:8000"
    volumes:
      - ./:/docs
    command: serve --dev-addr=0.0.0.0:8000 --strict

Docker Compose prüfen

Im jeweiligen Projektordner:

docker compose config

Container neu starten:

docker compose down
docker compose up -d

Container prüfen:

docker ps --format "table {{.Names}}\t{{.Ports}}"

Erwartung:

app1-web     127.0.0.1:8200->80/tcp
app1-docs    127.0.0.1:8201->8000/tcp

Lokale Erreichbarkeit testen:

curl -I http://127.0.0.1:8200
curl -I http://127.0.0.1:8201

Port-Konflikte prüfen

Prüfen, welche Dienste auf relevanten Ports laufen:

sudo ss -ltnp

Gezielt Port 80 prüfen:

sudo ss -ltnp | grep ':80'

Gezielt lokale App-Ports prüfen:

sudo ss -ltnp | grep ':8100'
sudo ss -ltnp | grep ':8200'
sudo ss -ltnp | grep ':8201'

Docker-Portbelegung prüfen:

docker ps --format "table {{.Names}}\t{{.Ports}}"

Praxisbeispiel Developer Playbook

Datei:

/home/fober/workspace/developer-playbook/docker-compose.yml

Konfiguration:

services:
  docs:
    image: squidfunk/mkdocs-material:latest
    container_name: developer-playbook-docs
    restart: unless-stopped
    ports:
      - "127.0.0.1:8100:8000"
    volumes:
      - ./:/docs
    command: serve --dev-addr=0.0.0.0:8000 --strict

Bedeutung:

Dienst Lokaler Port Container-Port Zweck
developer-playbook-docs 127.0.0.1:8100 8000 Developer Playbook

Prüfen:

cd /home/fober/workspace/developer-playbook
docker compose ps
curl -I http://127.0.0.1:8100

Praxisbeispiel Immohai

Datei:

/home/fober/projects/immohai/docker-compose.yml

Konfiguration:

services:
  web:
    image: nginx:latest
    container_name: immohai-web
    restart: always
    ports:
      - "127.0.0.1:8200:80"
    volumes:
      - ./frontend:/usr/share/nginx/html:ro

  docs:
    image: squidfunk/mkdocs-material:latest
    container_name: immohai-docs
    restart: always
    ports:
      - "127.0.0.1:8201:8000"
    volumes:
      - ./:/docs
    command: serve -a 0.0.0.0:8000

Bedeutung:

Dienst Lokaler Port Container-Port Zweck
immohai-web 127.0.0.1:8200 80 Immohai App
immohai-docs 127.0.0.1:8201 8000 Immohai Doku

Prüfen:

cd /home/fober/projects/immohai
docker compose ps
curl -I http://127.0.0.1:8200
curl -I http://127.0.0.1:8201

Aktuelle Port-Zuordnung im Praxisbeispiel

127.0.0.1:8100 → Developer Playbook
127.0.0.1:8200 → Immohai App
127.0.0.1:8201 → Immohai Dokumentation

Best Practices

  • Für Docker-Dienste hinter Nginx immer 127.0.0.1 verwenden.
  • Keine App direkt auf 0.0.0.0:80 veröffentlichen.
  • Portbereiche pro App reservieren.
  • App und Dokumentation nebeneinander dokumentieren.
  • Container-Namen sprechend wählen.
  • Nach Portänderungen Container neu starten.
  • Portbelegung immer mit docker ps und ss prüfen.

Typische Fehler

Fehler Ursache Lösung
Nginx startet nicht Docker belegt Port 80 Container-Port auf 127.0.0.1:<port> ändern
App ist lokal nicht erreichbar Container läuft nicht docker compose ps und Logs prüfen
App ist öffentlich nicht erreichbar Nginx zeigt auf falschen Port proxy_pass prüfen
Port ist bereits belegt anderer Container nutzt denselben Port anderen lokalen Port wählen
Container ist öffentlich erreichbar Port-Mapping nutzt 0.0.0.0 auf 127.0.0.1 beschränken

Checkliste

  • [ ] Portbereich für Projekt festgelegt
  • [ ] App-Port festgelegt
  • [ ] Doku-Port festgelegt
  • [ ] Docker Compose auf 127.0.0.1 umgestellt
  • [ ] keine Container direkt auf 0.0.0.0:80
  • [ ] docker compose config geprüft
  • [ ] Container neu gestartet
  • [ ] docker ps geprüft
  • [ ] lokale App per curl getestet
  • [ ] lokale Doku per curl getestet