DEVOPSDOCKER

DDEV aus Entwicklersicht: Erfahrungen aus der täglichen Praxis

11. März 202612 Min.

tl;dr: Ich würde auf DDEV nicht mehr verzichten wollen und kann es jedem Web-Entwickler ans Herz legen sich das einmal anzuschauen.

Als Fullstack Developer kenne ich den Kampf mit verschiedenen Entwicklungsumgebungen nur zu gut. Wir sind eine Agentur, die täglich mit unterschiedlichsten Kundenprojekten und Technologien arbeitet. Jedes Projekt hat seine eigenen Anforderungen, andere PHP Versionen, spezifische Node Versionen, und natürlich wollen alle Teammitglieder die gleiche konsistente Umgebung haben.

Das Problem mit traditionellen Setups

Vor DDEV hatte jedes Projekt seine eigene Mischung aus lokal installiertem PHP (via Homebrew oder Laravel Herd auf dem Mac), XAMPP, MAMP, individuellen Docker Compose Konfigurationen oder anderen Lösungen. Das führte zu klassischen Agentur Problemen:

  • „Bei mir läuft es aber lokal!“
  • Stundenlanges Einrichten neuer Projekte
  • Inkompatible Versionen zwischen Entwicklern
  • Unterschiede zwischen lokaler und Produktivumgebung

Besonders das „lokal gehts aber“-Problem war ein ständiger Begleiter. Neue Teammitglieder benötigten oft mehrere Stunden, um ein Projekt lokal zum Laufen zu bringen.

Warum DDEV für Agenturen ideal ist

Schnelle Projektinitialisierung

Mit zwei einfachen Befehlen lässt sich ein neues Projekt aufsetzen:

bash
ddev config
ddev start

Das ist besonders wertvoll, wenn wir zwischen verschiedenen Systemen wie Laravel, TYPO3 oder Next.js wechseln müssen. DDEV bietet vordefinierte Konfigurationen für zahlreiche gängige Systeme: backdrop, cakephp, craftcms, drupal, generic, laravel, magento, php, shopware6, silverstripe, symfony, typo3, wordpress und viele mehr. Für einfache PHP Umgebungen ohne Framework reicht die Standard Konfiguration aus.

SSL und HTTPS von Haus aus

Ein oft unterschätzter Vorteil: DDEV generiert automatisch gültige SSL Zertifikate für alle lokalen Domains. Kein manuelles Zertifikate erstellen, keine Browser Warnungen, keine Konfiguration. Das funktioniert sofort:

yaml
# Beispiel aus einer .ddev/config.yaml
name: demo-projekt
type: php
docroot: public
webserver_type: nginx

DDEV richtet automatisch HTTPS ein. In unserem Beispiel wäre es https://demo-projekt.ddev.site. Perfekt für Projekte, die zwingend eine sichere Umgebung benötigen, etwa bei OAuth2 Integrationen oder Payment Tests.

Produktivsystem Abbildung

Die Möglichkeit, exakt die gleiche PHP Version, Datenbank und Server Konfiguration wie auf dem Live Server zu nutzen, hat unsere Deployment Probleme massiv reduziert. Wir können vorab bestimmte Server Packages updaten und prüfen, ob das System danach noch reibungslos läuft. So gibt es keine Überraschungen mehr beim Deployen.

Integrierte Developer Tools

Alle notwendigen Tools sind direkt im Container verfügbar:

  • Composer für PHP-Abhängigkeiten
  • Node/Yarn für Frontend-Builds
  • WP-CLI für WordPress-Projekte
  • MySQL/PostgreSQL als Datenbanken
  • Mailpit um Mails zu empfangen und zu verwalten
  • Xdebug fürs Debugging
Einfache Team-Zusammenarbeit

Die .ddev/config.yaml Datei wird in unser Versionskontrollsystem aufgenommen. Neue Teammitglieder können mit drei Befehlen arbeiten:

bash
git clone project-url project
cd project
ddev start

Das Problem „wie kann ich das lokal aufsetzen“ gehört damit der Vergangenheit an. Die Dokumentation ist im Projekt selbst enthalten.

Ihr wollt DDEV bei euch im Team etablieren?

Wir teilen unsere Erfahrungen gerne. Ob bei der Einführung, bei konkreten Projektfragen oder wenn es um die nächsten Schritte geht.

Konkrete Anwendungsfälle aus unserer Praxis

1. Multi-Domain Entwicklung

Für Kunden mit mehreren zusammenhängenden Systemen nutzen wir zusätzliche Hostnames:

yaml
additional_hostnames:
  - cms.demo-projekt
  - blog.demo-projekt
  - api.demo-projekt
additional_fqdns: 
  - api-test.live-projekt.de

Besonders nützlich: Wir können sogar Subdomains von Produktivsystemen einbinden, um beispielsweise Cookies für SSO-Lösungen korrekt zu testen oder Payment Provider Callbacks. In unserem Beispiel hätten wir die vier neuen Domains:

2. Redis als Cache

Die Redis-Integration erfolgt über eine zusätzliche Konfigurationsdatei. Für Laravel-Projekte, die standardmäßig Redis nutzen, erstellen wir eine docker-compose.redis.yaml:

yaml
services:
  redis:
    container_name: ddev-${DDEV_SITENAME}-redis
    image: redis:7
    restart: always
    ports:
      - 6382:6379
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    environment:
      - VIRTUAL_HOST=$DDEV_HOSTNAME
      - HTTP_EXPOSE=6379
    volumes: []
  web:
    links:
      - redis:$DDEV_HOSTNAME

Diese Datei wird im .ddev Verzeichnis gespeichert und automatisch von DDEV geladen. So können wir für jedes Projekt individuelle Services ergänzen und profitieren von deutlich schnelleren Antwortzeiten durch Redis Caching.

3. Eigene DDEV Hooks für Projekte
yaml
hooks:
  post-start:
    - exec: "yarn install"
    - exec: "yarn dev"

Damit wird yarn immer installiert und direkt ein yarn dev im Container ausgeführt. Das stellt sicher, dass alle Abhängigkeiten aktuell sind und der Development-Server sofort läuft.

4. Zusätzliche Services und Ports freigeben

In einem Projekt mit Next.js haben wir durch diese .ddev/config.yaml Anpassung den Port 3000 nach außen freigegeben:

yaml
web_extra_exposed_ports:
  - name: "NextJS Website Name"
    container_port: 3000
    http_port: 2999
    https_port: 3000

So können wir lokal auf Port 3000 zugreifen und den im Container laufenden Service erreichen. Diese einfache Anpassung muss nur einmal gemacht werden. Jedes Teammitglied profitiert direkt davon.

5. Debugging und Entwicklung

Xdebug funktioniert sofort ohne komplizierte Konfiguration. Mit ddev xdebug on aktivierst du es, mit ddev xdebug off deaktivierst du es (oder alternativ ddev xdebug toggle). Das spart wertvolle Zeit bei der Fehlersuche.

Damit Xdebug mit Visual Studio Code zusammenarbeitet, braucht es nur eine kleine Konfiguration. Lege dazu eine .vscode/launch.json Datei in deinem Projekt an:

json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "hostname": "0.0.0.0",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "${workspaceFolder}"
            },
            "preLaunchTask": "DDEV: Enable Xdebug",
            "postDebugTask": "DDEV: Disable Xdebug"
        }
    ]
}
6. Datenbank-Handling

Datenbank-Sicherungen und -Wiederherstellungen sind trivial:

bash
ddev export-db --file=backup.sql
ddev import-db --src=backup.sql

Für Kundenprojekte mit regelmäßigen Live-Daten-Imports ist das unschätzbar wertvoll.

Die Grenzen von DDEV – eine ehrliche Betrachtung

So sehr ich DDEV schätze, es gibt auch Schattenseiten, die man kennen sollte:

Abstraktionsschicht mit Wartezeit

DDEV fügt eine zusätzliche Abstraktionsschicht hinzu, die auch ausbremsen kann. Allein das Starten eines Projekts dauert meist eine Minuten wenn es viele Abhängigkeiten oder hooks enthält. Das summiert sich, wenn man täglich mehrmals zwischen Projekten wechselt.

Das Docker Port Problem

DDEV leidet unter dem typischen Docker Problem: Es dürfen keine doppelten exponierten Ports existieren. Das bedeutet: Entweder man startet nie mehrere Projekte gleichzeitig, oder man muss manuell darauf achten, dass alle Projekte unterschiedliche Ports verwenden. In der Praxis führt das oft zu "Port already in use" Fehlern.

Kein natives Next.js Template

DDEV spezialisiert sich stark auf PHP. Für Next.js gab es lange kein offizielles Template, und auch heute ist die Unterstützung für Node.js basierte Projekte nicht so ausgereift wie für PHP. Man kann es zum Laufen bringen, aber es erfordert Handarbeit.

KI Tools brauchen zusätzlichen Kontext

Wenn wir Code mit KI Assistenten wie Copilot oder Cursor schreiben, müssen wir bei jedem Projekt daran denken, den richtigen Kontext mitzugeben. Die Tools müssen wissen, dass sie Befehle mit ddev ausführen sollen: also ddev yarn statt nur yarnddev artisan statt php artisan.

Besonders beim Debuggen mit Cursor gibt es eine typische Hürde: Der Debug Modus sendet HTTP Requests standardmäßig an localhost. Der läuft aber auf der Host Maschine, nicht im Docker Container. Hier braucht es den Hinweis auf host.docker.internal, damit die Verbindung funktioniert.

Eine gute Abhilfe sind AGENT.md Dateien im Projekt. Darin können wir der KI einmalig erklären, wie sie mit DDEV umgehen soll. Einmal angelegt, merkt sich der Assistent diese Regeln und wendet sie automatisch an.

Ältere PHP Versionen verschwinden

DDEV pflegt nur die aktuellen PHP Versionen. Ältere Versionen wie PHP 5.6 oder 7.0 werden mit der Zeit aus den offiziellen Images entfernt. Für wartende Legacy Projekte kann das problematisch werden. Zwar lassen sich oft noch ältere Images finden, aber der offizielle Support endet irgendwann.

Ressourcen Hunger

Mehrere gleichzeitig laufende Projekte beanspruchen viel RAM. Auf einem Developer Laptop mit 16 GB stößt man schnell an Grenzen, wenn drei oder vier Projekte parallel laufen.

Quick Wins für den Agentur Alltag

Git-Integration

Mit dem Befehl ddev auth ssh wird der lokale SSH Key in den DDEV Container gepusht. Danach kann der Container von innen heraus mit diesem Key auf Systeme zugreifen, für die er berechtigt ist. Das ist besonders praktisch, wenn wir private Packages aus internen Repos installieren müssen. Der Container verhält sich dann so, als hätte er selbst den SSH Key, ohne dass wir Keys manuell kopieren oder auslagern müssen.

Custom-Commands

Im .ddev/commands/ Ordner können wir Bash Dateien anlegen, um wiederkehrende Befehle einmal zu definieren und immer wieder zu nutzen. Bei einem Kunden haben wir uns ein Datenbank Backup Script gebaut, das bestimmte Tabellen exportiert und direkt in unsere lokale DDEV Datenbank importiert. Dabei nutzt das Script den SSH Key, den wir vorher in den Container gepusht haben, damit der Ziel Server unsere Anfrage autorisiert. Einmal gebaut, spart uns dieses Custom Command jede Woche wertvolle Zeit.

Einfache Konfigurationsanpassungen

Änderungen an der Entwicklungsumgebung sind für jedes Teammitglied sofort nachvollziehbar. Wenn wir in einem extra Git Branch ein PHP Upgrade vorbereiten, ändert sich in der .ddev/config.yaml nur eine Zeile:

yaml
# vorher
php_version: "8.3"
# nachher
php_version: "8.4"

Diese kleine Anpassung erspart uns den ganzen manuellen Installations und Anpassungs Kram. Jeder im Team wechselt einfach den Branch, startet DDEV neu und hat die neue PHP Version. Kein "bei mir funktioniert das nicht", keine stundenlangen Einrichtungs Sessions.

Mein Fazit

Nach rund acht Jahren intensiver DDEV Nutzung in zahlreichen Kunden und privaten Projekten kann ich klar sagen: Ich würde auf DDEV nicht mehr verzichten wollen. In jeder Agentur, in der ich gearbeitet habe, habe ich DDEV etabliert und die positiven Effekte waren spürbar.

Die Einarbeitungszeit ist minimal und amortisiert sich innerhalb kürzester Zeit. Was ich besonders schätze: Die Konfiguration ist gut dokumentiert, für jeden verständlich und einfach anzupassen. Das sorgt für Konsistenz über alle Projekte hinweg.

Für Agenturen, die mit verschiedenen CMS Systemen, unterschiedlichen Kundenanforderungen und mehreren Entwicklern arbeiten, ist DDEV ein Segen. Es standardisiert Entwicklungsprozesse, reduziert Einrichtungszeiten und sorgt für konsistente Umgebungen.

Der einzige „Fluch“ ist, dass man einmal erlebt hat, wie einfach lokale Entwicklung sein kann. Zurück zu alten Methoden möchte danach niemand mehr.

Meine Empfehlung: Gebt DDEV einen Chance. Startet entweder mit einem neuen Projekt und setzt es direkt mit DDEV auf, oder portiert ein bestehendes Projekt. Beide Wege sind gleichermaßen einfach. Die Lernkurve ist flach, der Payoff enorm. Die Zeit, die ihr in die Einrichtung investiert, holt ihr durch wegfallende "bei mir geht es" Diskussionen und schnelleres Onboarding neuer Teammitglieder vielfach wieder rein.

Alexander Frank

Systemarchitekt für Webplattformen

Über den Autor

Ich bin Fullstack Developer bei den nauten und seit über acht Jahren in der Agenturentwicklung zu Hause. In dieser Zeit habe ich Dutzende Projekte betreut: komplexe Shopware Systeme, große API Schnittstellen, individuelle Anwendungen und Laravel Projekte.

Ihr wollt DDEV bei euch im Team etablieren?

Wir teilen unsere Erfahrungen gerne. Ob bei der Einführung, bei konkreten Projektfragen oder wenn es um die nächsten Schritte geht.