Lösung: Nginx Webserver
Projektstruktur
Abschnitt betitelt „Projektstruktur“nginx-lab/├── docker-compose.yml├── html/│ ├── index.html│ └── about.html└── conf/ # Optional └── default.confVollständige docker-compose.yml
Abschnitt betitelt „Vollständige docker-compose.yml“Einfache Version
Abschnitt betitelt „Einfache Version“services: nginx: image: nginx:alpine container_name: nginx-lab restart: unless-stopped ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html:roMit Custom Config
Abschnitt betitelt „Mit Custom Config“services: nginx: image: nginx:alpine container_name: nginx-lab restart: unless-stopped ports: - "8080:80" volumes: - ./html:/usr/share/nginx/html:ro - ./conf/default.conf:/etc/nginx/conf.d/default.conf:roErwartete Ausgaben
Abschnitt betitelt „Erwartete Ausgaben“Container starten
Abschnitt betitelt „Container starten“$ docker compose up -d[+] Running 2/2 ✔ Network nginx-lab_default Created ✔ Container nginx-lab StartedBrowser-Aufruf
Abschnitt betitelt „Browser-Aufruf“Bei http://localhost:8080 sollte die HTML-Seite erscheinen.
$ docker compose logs nginxnginx-lab | 172.17.0.1 - - [10/Mar/2024:14:30:00 +0000] "GET / HTTP/1.1" 200 1234 "-" "Mozilla/5.0..."nginx-lab | 172.17.0.1 - - [10/Mar/2024:14:30:01 +0000] "GET /about.html HTTP/1.1" 200 456 "-" "Mozilla/5.0..."Antworten auf Reflexionsfragen
Abschnitt betitelt „Antworten auf Reflexionsfragen“1. Unterschied nginx:latest vs nginx:alpine
Abschnitt betitelt „1. Unterschied nginx:latest vs nginx:alpine“| Image | Basis | Grösse | Inhalt |
|---|---|---|---|
nginx:latest | Debian | ~140 MB | Vollständiges Debian |
nginx:alpine | Alpine Linux | ~40 MB | Minimales Linux |
Alpine ist kleiner und sicherer (weniger Angriffsfläche), aber manche Tools fehlen (z.B. bash → nur sh).
2. Warum :ro (read-only)?
Abschnitt betitelt „2. Warum :ro (read-only)?“- Sicherheit: Container kann die Dateien nicht verändern
- Best Practice: Nur Schreibrechte geben wo nötig
- Fehlerprävention: Verhindert versehentliche Änderungen
Ohne :ro könnte ein kompromittierter Container die HTML-Dateien manipulieren.
3. Was passiert bei Port 80 statt 8080?
Abschnitt betitelt „3. Was passiert bei Port 80 statt 8080?“ports: - "80:80"- Auf Linux: Ports unter 1024 benötigen Root-Rechte
- Auf macOS/Windows: Funktioniert, aber Port 80 könnte belegt sein
- Konflikt: Andere Webserver (Apache, IIS) nutzen oft Port 80
4. Wie HTTPS hinzufügen?
Abschnitt betitelt „4. Wie HTTPS hinzufügen?“Option A: Mit selbstsigniertem Zertifikat
# Zertifikat erstellenopenssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout ssl/nginx.key -out ssl/nginx.crtserver { listen 443 ssl; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key;
root /usr/share/nginx/html;}
server { listen 80; return 301 https://$host$request_uri;}services: nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./html:/usr/share/nginx/html:ro - ./conf/default.conf:/etc/nginx/conf.d/default.conf:ro - ./ssl:/etc/nginx/ssl:roOption B: Mit Let’s Encrypt (Produktion)
Für echte Zertifikate: Certbot oder Traefik als Reverse Proxy verwenden.
Bonus: Nginx als Reverse Proxy
Abschnitt betitelt „Bonus: Nginx als Reverse Proxy“Nginx vor anderen Containern (z.B. Node.js App):
services: nginx: image: nginx:alpine ports: - "80:80" volumes: - ./conf/proxy.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - app
app: image: node:20-alpine working_dir: /app volumes: - ./app:/app command: node server.js expose: - "3000"server { listen 80;
location / { proxy_pass http://app:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }}