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.1verwenden. - Keine App direkt auf
0.0.0.0:80verö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 psundssprü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.1umgestellt - [ ] keine Container direkt auf
0.0.0.0:80 - [ ]
docker compose configgeprüft - [ ] Container neu gestartet
- [ ]
docker psgeprüft - [ ] lokale App per
curlgetestet - [ ] lokale Doku per
curlgetestet