Docker Nginx vollständiger Leitfaden: Konfigurations-Mounts, HTTPS und Reverse Proxy

Sie drücken zum siebten Mal docker restart nginx, laden die Seite neu – und sehen weiterhin die 502-Fehlerseite. Sie haben nginx.conf geändert, aber die Konfiguration im Container wirkt einfach nicht.
Konfigurationsprobleme beim Docker-Deployment von Nginx kennt fast jeder, der Container einsetzt. Config-Mounts, HTTPS-Zertifikate, Kommunikation zwischen Containern – das klingt einfach, birgt aber viele Fallstricke. Dieser Artikel liefert ein vollständiges, praxistaugliches Setup: von korrekten Mount-Varianten über automatische Zertifikatserneuerung bis zur Netzwerkkonfiguration für Reverse Proxy.
Sie lernen:
- Warum geänderte Konfigurationen nicht greifen – und 5 bewährte Mount-Varianten
- Den vollständigen HTTPS-Pfad von selbstsignierten Zertifikaten bis Let’s Encrypt
- Netzwerk-Tricks beim Reverse Proxy für andere Docker-Container
- Sicherheits-Härtung und Performance-Tuning für die Produktion
Docker Nginx: Grundkonfiguration und Datei-Mounts
Warum Konfigurationsdateien mounten?
Die Frage kommt oft: Kann man Nginx-Config nicht einfach ins Image packen? Geht schon – aber der Aufwand lohnt sich selten.
Jede kleine Änderung bedeutet: Image neu bauen, in die Registry pushen, pullen, Container neu starten – leicht 15 Minuten. Dazu kommen Versionsverwaltung und Multi-Environment-Switching. Um zwei Uhr nachts ein Rollback brauchen und auf den Image-Build warten? Unschön.
Config-Mounts lösen genau das: Datei auf dem Host ändern, im Container sofort wirksam. Testen, Rollback und Teamarbeit werden deutlich einfacher.
Wichtige Verzeichnisse im Nginx-Container
Zuerst die Struktur im Container:
/etc/nginx/
├── nginx.conf # Hauptkonfiguration
├── conf.d/ # Unterconfigs, Site-Konfigurationen
│ └── default.conf # Standard-Site
/usr/share/nginx/html # Document Root für statische Dateien
/var/log/nginx/ # Log-Verzeichnis
├── access.log
└── error.log
Entscheidend: In nginx.conf steht include /etc/nginx/conf.d/*.conf;. Die Hauptconfig lädt automatisch alle .conf-Dateien aus conf.d. Nur nginx.conf mounten und conf.d vergessen – der erste klassische Fehler.
Korrekte Mount-Variante: Schritt für Schritt
Nicht gleich den Container starten. Eine kurze Vorbereitung spart später viel Ärger.
Schritt 1: Standard-Config aus dem Container als Vorlage kopieren
Warum? Die offizielle Default-Config ist getestet – darauf aufbauen ist zuverlässiger als bei null anfangen.
# Temporären Container starten
docker run --name nginx-temp -d nginx
# Standard-Config exportieren
docker cp nginx-temp:/etc/nginx/nginx.conf ./nginx/nginx.conf
docker cp nginx-temp:/etc/nginx/conf.d ./nginx/conf.d
# Aufräumen
docker stop nginx-temp && docker rm nginx-temp
Schritt 2: Standard-Verzeichnisstruktur auf dem Host anlegen
Ich lege Docker-Dateien unter /opt ab – Sie können den Pfad anpassen:
mkdir -p /opt/nginx/{conf,conf.d,html,logs,ssl}
Diese Struktur deckt Config, statische Dateien, Logs und SSL-Zertifikate ab.
Schritt 3: Container starten und alle Verzeichnisse mounten
Auf die Pfadzuordnung bei jedem -v achten:
docker run -d --name my-nginx \
-p 80:80 -p 443:443 \
-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \
-v /opt/nginx/conf.d:/etc/nginx/conf.d \
-v /opt/nginx/html:/usr/share/nginx/html \
-v /opt/nginx/logs:/var/log/nginx \
-v /opt/nginx/ssl:/etc/nginx/ssl \
nginx
Wichtige Punkte:
-p 80:80 -p 443:443: HTTP und HTTPS (für HTTPS später nötig):robei nginx.conf – Schreibschutz gegen versehentliche Änderungen im Container- conf.d als ganzes Verzeichnis mounten, nicht als Einzeldatei (Grund gleich unten)
Vier typische Fallen
Falle 1: Nach vim-Bearbeitung synchronisiert der Container nicht
Klassiker: nginx.conf auf dem Host geändert, Container neu gestartet – keine Wirkung.
Ursache: vim erzeugt beim Speichern oft eine neue Datei mit neuem inode. Docker bindet über den inode – ändert sich der, zeigt der Container weiter die alte Datei.
Zwei Lösungen:
- Option A: nano nutzen (inode bleibt gleich)
- Option B: ganzes Verzeichnis statt Einzeldatei mounten
Ich nutze Option B. Beim Verzeichnis-Mount ist der inode egal; Configs lassen sich flexibel hinzufügen und entfernen.
Falle 2: Falscher include-Pfad
Im Container prüfen:
docker exec -it my-nginx bash
cat /etc/nginx/nginx.conf | grep include
Diese Zeile muss existieren:
include /etc/nginx/conf.d/*.conf;
Wenn Sie /opt/nginx/conf.d/*.conf (Host-Pfad) eintragen, ist das falsch. Im Container gelten nur Container-Pfade.
Falle 3: conf.d nicht gemountet
Nur nginx.conf reicht nicht. Neue Site-Configs unter conf.d auf dem Host sind im Container unsichtbar.
Prüfen:
docker exec my-nginx ls /etc/nginx/conf.d
Es sollten alle Dateien aus /opt/nginx/conf.d sichtbar sein.
Falle 4: Dateiberechtigungen blockieren Nginx
Unter Linux häufig: Config zu restriktiv, Nginx-Prozess (User nginx) kann nicht lesen.
Lösung:
chmod 644 /opt/nginx/conf/nginx.conf
chmod 644 /opt/nginx/conf.d/*.conf
Nach Änderungen Syntax testen:
docker exec my-nginx nginx -t
Bei syntax is ok passt es.
Einzeldatei vs. Verzeichnis-Mount: Was wählen?
nginx.conf (Hauptconfig): Einzeldatei + :ro – selten geändert
conf.d: immer Verzeichnis-Mount – flexibel für neue Sites
html, logs: Verzeichnis-Mount
Faustregel: Mehrere Dateien flexibel verwalten → Verzeichnis. Kernconfig mit Versionskontrolle → Einzeldatei mit Schreibschutz.
HTTPS und Let’s Encrypt Auto-Renewal
Selbstsigniertes Zertifikat: Schnelltest in der Entwicklung
In Produktion brauchen Sie echte Zertifikate; für Dev/Test reicht selbstsigniert:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /opt/nginx/ssl/nginx.key \
-out /opt/nginx/ssl/nginx.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Dev/CN=localhost"
Erzeugt zwei Dateien:
nginx.key: privater Schlüssel – niemals preisgebennginx.crt: Zertifikat
In /opt/nginx/conf.d/ eine ssl.conf anlegen:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
Wichtig:
ssl_certificate-Pfade sind Container-Pfade (/etc/nginx/ssl), nicht/opt/nginx/sslauf dem Host- Nur TLS 1.2 und 1.3 – ältere Protokolle sind unsicher
-p 443:443nicht vergessen
Config hot-reloaden:
docker exec my-nginx nginx -s reload
Unter https://localhost warnt der Browser vor nicht vertrauenswürdigem Zertifikat – normal bei selbstsigniert. Einfach fortfahren.
Let’s Encrypt: Kostenlose Zertifikate für Produktion
Let’s Encrypt ist praktisch: kostenlos, automatisiert, global vertrauenswürdig. Nachteil: 90 Tage Laufzeit – mit Auto-Renewal kein Problem.
Empfehlung: docker-compose + certbot-Container – deutlich zuverlässiger als manuelles Setup.
Vollständige docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
networks:
- web
certbot:
image: certbot/certbot
container_name: certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
networks:
- web
networks:
web:
driver: bridge
Kernpunkte:
1. Geteilte Mounts für Zertifikate und Validierung
./certbot/confin beiden Containern – certbot erzeugt, nginx liest./certbot/wwwfür HTTP-Validierung (webroot)
2. Nginx reload alle 6 Stunden
Hintergrund-Loop: alle 6 Stunden reload – erneuerte Zertifikate greifen sofort.
3. Certbot prüft alle 12 Stunden
Let’s Encrypt empfiehlt tägliche Prüfung; 12 Stunden ist sicherer.
Erstmalige Zertifikatsanforderung
In /opt/nginx/conf.d/ zuerst temp.conf für HTTP-Validierung:
server {
listen 80;
server_name your-domain.com; # Ihre Domain
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
Services starten:
docker-compose up -d
Zertifikat anfordern (Domain und E-Mail anpassen):
docker-compose run --rm certbot certonly --webroot \
-w /var/www/certbot \
-d your-domain.com \
--email [email protected] \
--agree-tos \
--no-eff-email
Bei Erfolg erscheint „Congratulations!”. Zertifikate liegen unter ./certbot/conf/live/your-domain.com/.
Jetzt die finale HTTPS-Config – temp.conf anpassen:
server {
listen 80;
server_name your-domain.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
# SSL-Optimierung
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# HSTS (HTTPS erzwingen)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
Reload:
docker-compose exec nginx nginx -s reload
Auto-Renewal prüfen
Let’s-Encrypt-Zertifikate gelten 90 Tage; certbot erneuert ab 30 Tagen Restlaufzeit. Manuell testen:
docker-compose run --rm certbot renew --dry-run
Bei „The dry run was successful” passt alles.
Logs prüfen:
docker-compose logs certbot
Zusätzliche SSL-Sicherheit
Optional für strengere SSL-Konfiguration:
# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/your-domain.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# iframe-Einbettung verbieten (Clickjacking-Schutz)
add_header X-Frame-Options DENY;
# XSS-Schutz
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
Anschließend auf SSL Labs testen – A+ ist erreichbar.
Reverse Proxy und Docker-Container-Kommunikation
Netzwerk-Grundlagen
Nginx als Reverse Proxy für andere Container – am meisten Ärgernis macht das Netzwerk. Container-IP direkt nutzen? Nach Neustart ändert sich die IP, Config muss angepasst werden.
Zwei häufige Modi:
- bridge: Standard, Container kommunizieren über virtuelle Bridge
- host: Host-Netzwerkstack, performant, wenig Isolation
Für Reverse Proxy empfehle ich ein eigenes Bridge-Netzwerk:
- Kommunikation über Servicenamen statt IP
- Netzwerk-Isolation pro Projekt
- Automatische DNS-Auflösung durch Docker
Eigenes Netzwerk anlegen und Container starten
Netzwerk erstellen:
docker network create my-app-network
Backend starten (z. B. Node.js-API):
docker run -d \
--name backend-api \
--network my-app-network \
-e NODE_ENV=production \
my-backend:latest
Nginx im gleichen Netzwerk:
docker run -d \
--name my-nginx \
--network my-app-network \
-p 80:80 -p 443:443 \
-v /opt/nginx/conf.d:/etc/nginx/conf.d \
nginx
Im gleichen Netzwerk erreichen Sie das Backend unter dem Namen backend-api.
Reverse-Proxy-Konfiguration in der Praxis
In /opt/nginx/conf.d/ api-proxy.conf anlegen:
upstream backend {
server backend-api:3000; # Containername:Port
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
# API-Proxy
location /api/ {
proxy_pass http://backend/;
# Echte Client-Informationen weitergeben
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket-Unterstützung (falls nötig)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Timeouts
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
# Statische Dateien direkt durch Nginx
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html;
}
}
Leicht übersehene Details:
1. upstream und proxy_pass – Pfadbehandlung
proxy_pass http://backend/; mit abschließendem Slash: /api/users wird zu http://backend/users (Präfix /api entfernt).
Ohne Slash: http://backend/api/users (voller Pfad bleibt).
2. X-Forwarded-For
Backend braucht diesen Header für die echte Client-IP – sonst sieht es nur die Nginx-Container-IP.
3. keepalive-Pool
keepalive 32 im upstream spart TCP-Handshakes – wichtig bei hoher Last.
Multi-Container mit docker-compose vereinfachen
Netzwerk und Container einzeln starten ist mühsam – docker-compose in einem Schritt:
version: '3.8'
services:
backend:
image: my-backend:latest
container_name: backend-api
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://db:5432/mydb
networks:
- app-network
depends_on:
- db
nginx:
image: nginx:latest
container_name: my-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./nginx/logs:/var/log/nginx
networks:
- app-network
depends_on:
- backend
db:
image: postgres:14
container_name: postgres-db
environment:
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=mydb
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data:
Gesamten Stack starten:
docker-compose up -d
Docker erledigt automatisch:
- Netzwerk
app-networkanlegen - Startreihenfolge per
depends_on - DNS zwischen Containern
In der Nginx-Config reichen backend und db als Hostnamen.
Typische Proxy-Probleme debuggen
Problem 1: 502 Bad Gateway
Häufigste Ursachen:
- Backend nicht gestartet oder abgestürzt
- Nginx und Backend in unterschiedlichen Netzwerken
- Falscher Backend-Port
Debug-Schritte:
# Backend prüfen
docker ps | grep backend
# Netzwerk prüfen
docker network inspect my-app-network
# Aus Nginx-Container testen
docker exec -it my-nginx sh
ping backend-api
curl http://backend-api:3000/health
Kein ping → Netzwerkproblem. curl-Timeout → Backend lauscht falsch.
Problem 2: Request-Timeout
Standard-Proxy-Timeout: 60 Sekunden. Bei langen API-Läufen (Uploads, schwere Berechnungen) erhöhen:
location /api/long-running/ {
proxy_pass http://backend/;
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
Problem 3: POST-Body geht verloren
Manchmal wird POST zu GET oder Body ist leer:
location /api/ {
proxy_pass http://backend/;
proxy_request_buffering off; # Request-Buffering deaktivieren
client_max_body_size 100M; # Große Uploads erlauben
}
Load Balancing für mehrere Backends
Mehrere Backend-Instanzen – Nginx verteilt die Last:
upstream backend_cluster {
least_conn; # Wenigste Verbindungen
server backend-1:3000 weight=3;
server backend-2:3000 weight=1;
server backend-3:3000 backup; # Backup-Server
keepalive 32;
}
server {
listen 80;
location /api/ {
proxy_pass http://backend_cluster/;
# ... weitere proxy-Einstellungen
}
}
Algorithmen:
round-robin(Standard): Round-Robinleast_conn: wenigste aktive Verbindungenip_hash: gleiche Client-IP → gleicher Server
Fällt ein Backend aus, leitet Nginx auf gesunde Knoten um.
Produktions-Best Practices und Performance
Konfigurationsverwaltung: Nicht ungeschützt live gehen
Configs lose auf dem Server ablegen – okay für Dev. In Produktion braucht es Struktur.
Git für Configs
Separates Repo für alle Nginx-Configs, Umgebungen in Unterverzeichnissen:
- Versionshistorie, Rollback per
git checkout - Team-Review per Pull Request
- CI/CD-Integration
Config-Templates
Umgebungen ähneln sich – Templates mit Variablen sparen Arbeit. Deployment mit envsubst.
Log-Management: Bevor die Festplatte voll ist
Nginx-Logs wachsen schnell – bei hohem Traffic mehrere GB pro Tag. Ohne Rotation: Festplatte voll, Container down.
Log-Rotation
logrotate auf dem Host: täglich rotieren, 14 Tage behalten, alte Logs komprimieren. Nach Rotation nginx -s reopen, sonst schreibt Nginx weiter in die alte Datei.
Zentralisierte Logs
Bei mehreren Servern: ELK, Loki oder Cloud-Dienste. Docker-Log-Treiber oder Promtail eignen sich gut.
Graceful Reload: Nutzer merken nichts
Nach Config-Änderung nicht docker restart. Neustart bricht alle Verbindungen ab.
Richtig:
# Syntax prüfen
docker exec my-nginx nginx -t
# Dann reload
docker exec my-nginx nginx -s reload
reload ist graceful: neue Worker mit neuer Config, alte Worker beenden laufende Requests – nahtloser Wechsel.
Sicherheits-Checkliste vor Go-Live
1. Nginx-Version verbergen
Standard-Fehlerseiten zeigen die Version – Angriffsfläche für bekannte CVEs. In http-Block: server_tokens off;
2. Rate Limiting gegen DDoS
http {
# Anfragen pro IP begrenzen
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
# Gleichzeitige Verbindungen begrenzen
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_conn conn_limit 10;
proxy_pass http://backend/;
}
}
3. Config schreibgeschützt mounten
Hauptconfig mit :ro.
4. Least Privilege
In nginx.conf user nginx; – nicht root, sonst großes Sicherheitsrisiko.
Performance-Tuning
Worker-Prozesse
worker_processes auto; # An CPU-Kerne anpassen
worker_cpu_affinity auto; # CPU-Affinität
auto passt Worker an verfügbare Kerne an.
Verbindungslimits
events {
worker_connections 2048; # Max. Verbindungen pro Worker
use epoll; # Unter Linux am performantesten
}
Theoretisches Maximum: worker_processes * worker_connections. Praktisch auch ulimit -n beachten.
gzip-Kompression
Textinhalte oft 60–80 % kleiner:
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6; # Level 1–9, 6 ist guter Kompromiss
gzip_types
text/plain
text/css
text/xml
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
gzip_min_length 1000; # Unter 1 KB nicht komprimieren
}
Caching statischer Assets
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
HTTP/2
server {
listen 443 ssl http2;
# ... weitere Config
}
Voraussetzung: HTTPS – HTTP/2 erfordert TLS.
Monitoring und Healthchecks
Nicht ohne Monitoring live gehen. Empfehlung: Prometheus + Grafana mit nginx-prometheus-exporter. stub_status in Nginx aktivieren, Zugriff auf Docker-internes Netz beschränken, Metriken scrapen, Dashboard in Grafana.
Fazit
Vier Kernthemen:
Config-Mounts: Verzeichnis statt Einzeldatei, Hauptconfig schreibgeschützt, conf.d und ssl nicht vergessen, vim-Inode-Falle vermeiden.
HTTPS: Dev mit selbstsigniert, Produktion mit Let’s Encrypt + Certbot. docker-compose macht Renewal nahezu wartungsfrei.
Reverse Proxy: Eigenes Bridge-Netzwerk, Kommunikation über Container-/Servicenamen, keepalive im upstream für Performance und Stabilität.
Produktion: Git für Config-Versionen, Log-Rotation, graceful reload statt restart, Sicherheitsmaßnahmen nicht auslassen.
Docker Nginx wirkt simpel, steckt aber voller Details. Wer das verstanden hat, baut eine stabile Web-Architektur von der Entwicklung bis zur Produktion.
Wenn dieser Artikel Ihnen Fallstricke erspart oder ein altes Problem gelöst hat, hat er seinen Zweck erfüllt. Probieren Sie es aus – bei Fragen gerne im Kommentar melden.
Praktischer Tipp: Config-Vorlagen aus diesem Artikel speichern und wiederverwenden. Das Rad muss nicht zweimal erfunden werden.
Vollständiger Ablauf: Docker Nginx bereitstellen
Konfigurations-Mounts, HTTPS und Reverse Proxy in der Praxis – typische Probleme wie nicht wirksame Configs und Container-Kommunikation lösen
⏱️ Estimated time: 1 hr
- 1
Step 1: Konfigurations-Mounts: 5 bewährte Varianten
5 bewährte Mount-Varianten:
• Einzelne Config-Datei: -v ./nginx.conf:/etc/nginx/nginx.conf
• Config-Verzeichnis: -v ./conf.d:/etc/nginx/conf.d
• Volume-Mount nutzen
• Mit docker-compose konfigurieren
• ConfigMap (Kubernetes-Umgebung)
Typische Probleme:
• Config geändert, wirkt aber nicht – nginx.conf im Container bleibt alt
• Config-Dateien korrekt mit -v mounten
• Config-Format prüfen
Best Practices:
• Verzeichnis-Mount statt Einzeldatei
• Hauptconfig schreibgeschützt (:ro)
• conf.d und ssl nicht vergessen
• vim-Inode-Falle vermeiden - 2
Step 2: HTTPS und Let's Encrypt Auto-Renewal
HTTPS-Konfiguration:
• Kostenlose Zertifikate von Let's Encrypt
• Auto-Renewal: certbot renew
• Zertifikatsverzeichnis mounten: -v ./certs:/etc/nginx/certs
• SSL-Zertifikatspfade konfigurieren
• HTTP/2 und TLS 1.3 unterstützen
Let's Encrypt:
• Zertifikat holen: certbot certonly --standalone
• Renewal testen: certbot renew --dry-run
• Zertifikate in Container mounten: -v ./letsencrypt:/etc/letsencrypt
• nginx.conf für Zertifikate konfigurieren - 3
Step 3: Reverse Proxy und Produktions-Best Practices
Reverse-Proxy-Konfiguration:
• upstream auf Backend-Container zeigen
• Container- oder Servicename: proxy_pass http://backend:8080
• Healthchecks konfigurieren
• CORS-Probleme behandeln
• Load Balancing einrichten
Produktions-Best Practices:
• Multi-Container mit docker-compose verwalten
• Healthchecks konfigurieren
• Ressourcenlimits setzen
• Log-Rotation einrichten
• Konfiguration über Umgebungsvariablen
• Images regelmäßig aktualisieren
Docker Nginx wirkt simpel, steckt aber voller Details – wer das verstanden hat, baut eine stabile Web-Architektur von der Entwicklung bis zur Produktion.
FAQ
Warum wirkt die geänderte Docker-Nginx-Konfiguration nicht?
5 bewährte Mount-Varianten:
1) Einzeldatei: -v ./nginx.conf:/etc/nginx/nginx.conf
2) Config-Verzeichnis: -v ./conf.d:/etc/nginx/conf.d
3) Volume-Mount
4) docker-compose
5) ConfigMap (Kubernetes)
Best Practices:
• Verzeichnis-Mount statt Einzeldatei
• Hauptconfig schreibgeschützt
• conf.d und ssl nicht vergessen
• vim-Inode-Falle vermeiden
Wie richte ich HTTPS für Docker Nginx ein?
• Kostenlose Zertifikate von Let's Encrypt
• Auto-Renewal: certbot renew
• Zertifikatsverzeichnis: -v ./certs:/etc/nginx/certs
• SSL-Zertifikatspfade konfigurieren
• HTTP/2 und TLS 1.3
Let's Encrypt:
• Zertifikat holen: certbot certonly --standalone
• Renewal testen: certbot renew --dry-run
• Zertifikate mounten: -v ./letsencrypt:/etc/letsencrypt
• nginx.conf für Zertifikate konfigurieren
Wie konfiguriere ich einen Reverse Proxy mit Docker Nginx?
• upstream auf Backend-Container
• Container- oder Servicename: proxy_pass http://backend:8080
• Healthchecks
• CORS-Probleme
• Load Balancing
Container-Kommunikation:
• Eigenes Netzwerk mit docker-compose
• Container im gleichen Netzwerk
• Zugriff über Servicename oder Containername
• upstream auf Backend-Service zeigen
Was sind Docker-Nginx-Best Practices für die Produktion?
• Multi-Container mit docker-compose
• Healthchecks
• Ressourcenlimits
• Log-Rotation
• Konfiguration über Umgebungsvariablen
• Images regelmäßig aktualisieren
Docker Nginx wirkt simpel, steckt aber voller Details – wer das verstanden hat, baut eine stabile Web-Architektur von der Entwicklung bis zur Produktion.
Tipp: Config-Vorlagen aus diesem Artikel speichern und beim nächsten Mal wiederverwenden.
11 Min. Lesezeit · Veröffentlicht am: 18. Dez. 2025 · Aktualisiert am: 14. Juli 2026
Docker Praxisleitfaden
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
Docker MySQL vollständiger Leitfaden: Von Datenspeicherung bis Master-Slave-Replikation
Von Docker-MySQL-Datenspeicherung bis zur Master-Slave-Replikation: Lösungen für Datenverlust nach Container-Neustart, Config-Mounts und Verbindungsfehler – ein produktionsreifes Deployment von A bis Z.
Teil 27 von 38
Nächster
Docker-Image-Sicherheitsscans und Behebung: Trivy-Praxis-Tutorial und CI/CD-Integrationsleitfaden
76 % der Images auf Docker Hub enthalten Sicherheitslücken. Dieser Artikel erklärt Trivy in der Praxis, systematische Schwachstellenbehebung und CI/CD-Automatisierung – mit vollständigen Befehlsbeispielen für sichere Container-Anwendungen.
Teil 29 von 38
Ähnliche Beiträge
Docker vs. virtuelle Maschine: Performance-Unterschiede und Szenario-Auswahl in 5 Minuten

Docker vs. virtuelle Maschine: Performance-Unterschiede und Szenario-Auswahl in 5 Minuten
Docker-Installation ohne Fallstricke (2025): Vollständige Lösungen von permission denied bis zum erfolgreichen Start


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen