Docker Web Stack: Nginx + App + DB mit Docker Compose

Ein moderner Web Stack lässt sich effizient mit Docker und Docker Compose auf Linux betreiben. Durch Containerisierung können Nginx als Reverse Proxy, die Anwendungslogik (PHP, Node.js, Python etc.) und die Datenbank isoliert, portabel und einfach orchestriert werden. In diesem Tutorial zeigen wir, wie ein kompletter Web Stack mit Docker Compose aufgebaut, konfiguriert und betrieben wird.

Voraussetzungen

  • Linux-Distribution: Ubuntu 22.04 LTS oder CentOS 9
  • Root- oder sudo-Zugriff
  • Docker installiert:
    sudo apt install docker.io -y
  • Docker Compose installiert:
    sudo apt install docker-compose -y
  • Grundlegende Kenntnisse von Linux CLI und Netzwerkkonzepten

Projektstruktur

Für eine saubere Orchestrierung empfiehlt sich folgende Verzeichnisstruktur:

/var/www/docker-webstack/
├─ app/
│  └─ Dockerfile
├─ nginx/
│  └─ default.conf
├─ db/
│  └─ init.sql
└─ docker-compose.yml

Dockerfile für die App

Die Anwendungslogik kann z. B. PHP-FPM, Node.js oder Python sein. Beispiel: PHP-FPM Laravel App.

# app/Dockerfile
FROM php:8.1-fpm

WORKDIR /var/www/html

# Abhängigkeiten installieren
RUN apt-get update && apt-get install -y 
    libpq-dev 
    libonig-dev 
    zip 
    unzip 
    git 
    && docker-php-ext-install pdo pdo_pgsql mbstring

COPY . .

RUN chown -R www-data:www-data /var/www/html

Nginx konfigurieren

Nginx wird als Reverse Proxy eingesetzt und leitet Anfragen an die App-Container weiter.

# nginx/default.conf
server {
    listen 80;
    server_name example.com www.example.com;

    location / {
        proxy_pass http://app:9000;
        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;
    }

    location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        access_log off;
    }
}

Datenbank initialisieren

PostgreSQL oder MySQL können via Container betrieben werden, inklusive Initialisierungsskripten.

# db/init.sql
CREATE DATABASE webapp;
CREATE USER webuser WITH PASSWORD 'Str0ngP@ss';
GRANT ALL PRIVILEGES ON DATABASE webapp TO webuser;

Docker Compose Datei

Docker Compose orchestriert alle Services und stellt Netzwerke, Volumes und Abhängigkeiten bereit.

# docker-compose.yml
version: "3.9"

services:
  app:
    build: ./app
    container_name: app
    restart: always
    networks:
      - webnet
    depends_on:
      - db
    environment:
      DB_HOST: db
      DB_PORT: 5432
      DB_NAME: webapp
      DB_USER: webuser
      DB_PASSWORD: Str0ngP@ss

  nginx:
    image: nginx:stable
    container_name: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app
    networks:
      - webnet

  db:
    image: postgres:15
    container_name: db
    restart: always
    environment:
      POSTGRES_DB: webapp
      POSTGRES_USER: webuser
      POSTGRES_PASSWORD: Str0ngP@ss
    volumes:
      - db-data:/var/lib/postgresql/data
      - ./db/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    networks:
      - webnet

volumes:
  db-data:

networks:
  webnet:

Starten des Stacks

cd /var/www/docker-webstack
docker-compose up -d
docker-compose ps

Monitoring und Logs

  • App Logs anzeigen:
    docker-compose logs -f app
  • Nginx Logs prüfen:
    docker-compose logs -f nginx
  • Datenbank Logs prüfen:
    docker-compose logs -f db

Netzwerkplanung

Alle Container befinden sich im selben Docker-Bridge-Netzwerk webnet. Für größere Deployments können Subnetze definiert werden.

Beispiel IPv4 Subnetz

<math>
App-IP = 172.20.0.2/24
DB-IP = 172.20.0.3/24
Nginx-IP = 172.20.0.4/24
Subnetzadresse = 172.20.0.0
Broadcastadresse = 172.20.0.255
</math>

IPv6 Subnetz (optional)

<math>
App-IP = fd00:abcd:1::2/64
DB-IP = fd00:abcd:1::3/64
Nginx-IP = fd00:abcd:1::4/64
Subnetzadresse = fd00:abcd:1::0
Broadcastadresse = fd00:abcd:1::ffff:ffff:ffff:ffff
</math>

Best Practices

  • Volatile Daten und Logs in Docker Volumes auslagern
  • Datenbank-Passwörter sicher in Environment-Variablen oder Secrets speichern
  • Statische Assets und Caching über Nginx optimieren
  • SSL/TLS via Reverse Proxy oder Let’s Encrypt einrichten
  • Prozessmanagement und Health Checks für Container einrichten
  • Backups regelmäßig durchführen, besonders für Datenbanken
  • Test- und Produktionsumgebung trennen
  • Firewall auf Host und Container-Ebene konfigurieren
  • Container-Updates kontrolliert durchführen, um Ausfälle zu vermeiden
  • Monitoring-Lösungen wie Prometheus oder Grafana für Logs und Performance nutzen

Konfiguriere Cisco Router & Switches und liefere ein Packet-Tracer-Lab/GNS3

Ich biete professionelle Unterstützung im Bereich Netzwerkkonfiguration und Network Automation für private Anforderungen, Studienprojekte, Lernlabore, kleine Unternehmen sowie technische Projekte. Ich unterstütze Sie bei der Konfiguration von Routern und Switches, der Erstellung praxisnaher Topologien in Cisco Packet Tracer, dem Aufbau und Troubleshooting von GNS3- und EVE-NG-Labs sowie bei der Automatisierung von Netzwerkaufgaben mit Netmiko, Paramiko, NAPALM und Ansible. Kontaktieren Sie mich jetzt – klicken Sie hier.

Meine Leistungen umfassen:

  • Professionelle Konfiguration von Routern und Switches

  • Einrichtung von VLANs, Trunks, Routing, DHCP, NAT, ACLs und weiteren Netzwerkfunktionen

  • Erstellung von Topologien und Simulationen in Cisco Packet Tracer

  • Aufbau, Analyse und Fehlerbehebung von Netzwerk-Labs in GNS3 und EVE-NG

  • Automatisierung von Netzwerkkonfigurationen mit Python, Netmiko, Paramiko, NAPALM und Ansible

  • Erstellung von Skripten für wiederkehrende Netzwerkaufgaben

  • Dokumentation der Konfigurationen und Bereitstellung nachvollziehbarer Lösungswege

  • Konfigurations-Backups, Optimierung bestehender Setups und technisches Troubleshooting

Benötigen Sie Unterstützung bei Ihrem Netzwerkprojekt, Ihrer Simulation oder Ihrer Network-Automation-Lösung? Kontaktieren Sie mich jetzt – klicken Sie hier.

Related Articles