DDEV — Lokale PHP-Entwicklungsumgebung mit Docker
Praxis-Guide zu DDEV — containerbasierte lokale Entwicklungsumgebung für PHP-Projekte wie Drupal, TYPO3 und WordPress, gesteuert über ein einheitliches CLI.
DDEV ist eine containerbasierte lokale Entwicklungsumgebung, die Webserver, Datenbank und PHP in Docker- oder Podman-Containern kapselt und über ein einheitliches CLI steuerbar macht. Statt jede Komponente von Hand zu installieren, beschreibst du dein Projekt in einer einzigen Konfigurationsdatei und startest die komplette Umgebung mit einem Befehl. Besonders im PHP- und CMS-Umfeld – Drupal, TYPO3, WordPress, Contao oder Shopware – hat sich das Werkzeug als Standard etabliert. Dieser Guide führt dich durch die wichtigsten Befehle für den Alltag, vom Anlegen eines Projekts über Datenbank-Im- und -Export bis zu Xdebug und Add-ons.
Projekt-Setup & Konfiguration
ddev config — Konfiguriert ein neues oder bestehendes DDEV-Projekt im aktuellen Verzeichnis interaktiv. Erstellt oder aktualisiert .ddev/config.yaml.
ddev configddev config --project-name <name> — Setzt den Projektnamen (wird für den Hostnamen verwendet:
ddev config --project-name myshopddev config --project-type <type> — Setzt den Projekttyp. Optionen: php, wordpress, drupal, drupal6, drupal7, drupal10, drupal11, typo3, magento, magento2, laravel, craftcms, django4, python und mehr.
ddev config --project-type wordpressddev config --php-version <version> — Setzt die PHP-Version für das Projekt. Unterstützt: 5.6, 7.0 – 7.4, 8.0 – 8.4.
ddev config --php-version 8.3ddev config --webserver-type <type> — Setzt den Webserver-Typ: nginx-fpm (Standard), apache-fpm oder nginx-gunicorn.
ddev config --webserver-type apache-fpmddev config --docroot <path> — Setzt das Document-Root relativ zum Projektverzeichnis.
ddev config --docroot webddev config --database <type>:<version> — Setzt Datenbanktyp und -version. Optionen: mysql:5.7, mysql:8.0, mariadb:10.6, mariadb:10.11, postgres:14 usw.
ddev config --database mariadb:10.11ddev config --additional-hostnames <names> — Fügt zusätzliche Hostnamen (kommagetrennt) hinzu, die auf das Projekt zeigen.
ddev config --additional-hostnames api.myshop,cdn.myshopddev config --timezone <tz> — Setzt die Zeitzone des Containers.
ddev config --timezone Europe/BerlinProjekt-Lebenszyklus
ddev start — Startet das DDEV-Projekt im aktuellen Verzeichnis. Lädt bei Bedarf Docker-Images herunter.
ddev startddev stop — Stoppt die Container des DDEV-Projekts, ohne sie zu entfernen.
ddev stopddev stop --all — Stoppt alle laufenden DDEV-Projekte auf dem Rechner.
ddev stop --allddev restart — Stoppt und startet das DDEV-Projekt. Übernimmt Konfigurationsänderungen.
ddev restartddev pause — Pausiert die Projekt-Container, um CPU/Speicher freizugeben, ohne den Zustand zu verlieren.
ddev pauseddev poweroff — Stoppt alle DDEV-Projekte und den globalen Router. Vor dem Herunterfahren verwenden.
ddev poweroffddev delete — Entfernt das DDEV-Projekt (Container, Volumes). Löscht NICHT die Projektdateien.
ddev deleteddev delete --omit-snapshot — Löscht das Projekt, ohne vorher einen Datenbank-Snapshot zu erstellen.
ddev delete --omit-snapshotddev delete images — Entfernt alle ungenutzten DDEV-Docker-Images, um Speicherplatz freizugeben.
ddev delete imagesStatus & Informationen
ddev describe — Zeigt detaillierten Status, URLs, Datenbank-Infos und Service-Details des aktuellen Projekts.
ddev describeddev list — Listet alle DDEV-Projekte auf dem Rechner mit ihrem Status auf.
ddev listddev list --active-only — Listet nur die aktuell laufenden DDEV-Projekte auf.
ddev list --active-onlyddev version — Zeigt die DDEV-Version und Systeminformationen an.
ddev versionddev launch — Öffnet die Projekt-URL im Standardbrowser.
ddev launchddev launch /path — Öffnet einen bestimmten Pfad der Projekt-URL im Browser.
ddev launch /wp-adminddev status — Zeigt den Status der Container des aktuellen Projekts an.
ddev statusShell & Befehlsausführung
ddev ssh — Öffnet eine SSH-Sitzung im Web-Container des aktuellen Projekts als Benutzer www-data.
ddev sshddev ssh -s db — Öffnet eine SSH-Sitzung im Datenbank-Container.
ddev ssh -s dbddev exec <command> — Führt einen Befehl im Web-Container aus.
ddev exec ls -la /var/www/htmlddev exec -s db <command> — Führt einen Befehl im Datenbank-Container aus.
ddev exec -s db mysql -u root -proot mydbddev exec --raw <command> — Führt einen Befehl ohne das Standard-Environment-Setup aus (roher Docker-exec).
ddev exec --raw cat /etc/os-releaseddev . <command> — Kurzform für ddev exec. Führt einen Befehl im Web-Container aus.
ddev . php -vDatenbank
ddev mysql — Öffnet eine interaktive MySQL-/MariaDB-Shell, verbunden mit der Projektdatenbank.
ddev mysqlddev mysql -e "<query>" — Führt eine SQL-Abfrage direkt aus der Shell aus.
ddev mysql -e "SHOW TABLES;"ddev import-db --file=<file> — Importiert einen Datenbank-Dump (.sql, .sql.gz, .sql.bz2, .tar, .zip) in die Projektdatenbank.
ddev import-db --file=dump.sql.gzddev import-db --database=<name> --file=<file> — Importiert einen Dump in eine bestimmte benannte Datenbank.
ddev import-db --database=staging --file=staging.sqlddev export-db --file=<file> — Exportiert die Projektdatenbank in eine komprimierte SQL-Datei.
ddev export-db --file=backup.sql.gzddev export-db --gzip=false --file=<file> — Exportiert die Datenbank als unkomprimierte SQL-Datei.
ddev export-db --gzip=false --file=backup.sqlddev export-db | gzip > backup.sql.gz — Exportiert die Datenbank nach stdout und leitet sie an gzip weiter.
ddev export-db | gzip > backup.sql.gzddev tableplus — Öffnet die Datenbank in der TablePlus-GUI (falls installiert).
ddev tableplusSnapshots
ddev snapshot — Erstellt einen Snapshot des aktuellen Datenbankzustands. Kann später wiederhergestellt werden.
ddev snapshotddev snapshot --name <name> — Erstellt einen benannten Datenbank-Snapshot zur leichteren Identifikation.
ddev snapshot --name before-migrationddev snapshot restore — Stellt den neuesten Datenbank-Snapshot wieder her.
ddev snapshot restoreddev snapshot restore <name> — Stellt einen bestimmten benannten Snapshot wieder her.
ddev snapshot restore before-migrationddev snapshot restore --latest — Stellt den neuesten Snapshot ohne Rückfrage wieder her.
ddev snapshot restore --latestddev snapshot list — Listet alle verfügbaren Snapshots des aktuellen Projekts auf.
ddev snapshot listddev snapshot delete <name> — Löscht einen bestimmten benannten Snapshot.
ddev snapshot delete before-migrationddev snapshot delete --all — Löscht alle Snapshots des aktuellen Projekts.
ddev snapshot delete --allComposer, PHP & Node
ddev composer <args> — Führt Composer im Web-Container mit der passenden PHP-Version aus.
ddev composer installddev composer require <package> — Fügt ein Composer-Paket im Container hinzu.
ddev composer require monolog/monologddev composer update — Aktualisiert alle Composer-Abhängigkeiten im Container.
ddev composer updateddev php <args> — Führt die PHP-CLI im Web-Container aus.
ddev php -vddev php artisan <command> — Führt einen Laravel-Artisan-Befehl im Container aus.
ddev php artisan migrateddev npm <args> — Führt npm im Web-Container aus.
ddev npm installddev npm run <script> — Führt ein npm-Skript im Container aus.
ddev npm run buildddev node <args> — Führt Node.js im Web-Container aus.
ddev node --versionddev yarn <args> — Führt Yarn im Web-Container aus (falls Yarn installiert ist).
ddev yarn installLogs
ddev logs — Zeigt die Logs des Web-Containers (stdout/stderr von nginx/apache + PHP).
ddev logsddev logs -f — Folgt den Logs des Web-Containers in Echtzeit (tail).
ddev logs -fddev logs -s db — Zeigt die Logs des Datenbank-Containers.
ddev logs -s dbddev logs -s db -f — Folgt den Logs des Datenbank-Containers in Echtzeit.
ddev logs -s db -fddev logs --tail <n> — Zeigt nur die letzten N Zeilen der Container-Logs.
ddev logs --tail 100Add-ons & Services
ddev add-on get <addon> — Installiert ein DDEV-Add-on (früher 'ddev get'). Add-ons liefern zusätzliche Dienste wie Redis, Solr, Memcached, Mailpit usw.
ddev add-on get ddev/ddev-redisddev add-on list --all — Listet alle verfügbaren offiziellen DDEV-Add-ons aus der Registry auf.
ddev add-on list --allddev add-on list — Listet die im Projekt installierten Add-ons auf.
ddev add-on listddev add-on remove <addon> — Entfernt ein installiertes Add-on aus dem Projekt.
ddev add-on remove ddev-redisddev add-on get ddev/ddev-mailpit — Installiert Mailpit zum lokalen Testen von E-Mails (ersetzt Mailhog).
ddev add-on get ddev/ddev-mailpitddev add-on get ddev/ddev-phpmyadmin — Installiert phpMyAdmin zur Datenbankverwaltung.
ddev add-on get ddev/ddev-phpmyadminddev add-on get ddev/ddev-adminer — Installiert Adminer als schlanke UI zur Datenbankverwaltung.
ddev add-on get ddev/ddev-adminerDateiverwaltung
ddev import-files --source=<path> — Importiert Dateien (tar.gz-Archiv oder Verzeichnis) in das Upload-/Dateiverzeichnis des Projekts.
ddev import-files --source=files.tar.gzddev export-files --destination=<path> — Exportiert das Upload-/Dateiverzeichnis des Projekts in ein tar.gz-Archiv.
ddev export-files --destination=files-backup.tar.gzddev exec scp <remote>:<path> <local> — Kopiert Dateien von einem Remote-Server in den Container per SCP über SSH-Agent-Weiterleitung.
ddev exec scp user@prod:/var/www/html/files ./filesGlobale Konfiguration
ddev config global — Zeigt und bearbeitet die globale DDEV-Konfiguration (gilt für alle Projekte).
ddev config globalddev config global --instrumentation-opt-in=false — Deaktiviert die Erhebung anonymer Nutzungsstatistiken.
ddev config global --instrumentation-opt-in=falseddev config global --use-hardened-images=true — Verwendet global gehärtete (sicherheitsoptimierte) Docker-Images.
ddev config global --use-hardened-images=trueddev config global --router-bind-all-interfaces=true — Bindet den DDEV-Router an alle Netzwerkschnittstellen (für LAN-Zugriff von anderen Geräten).
ddev config global --router-bind-all-interfaces=trueddev config global --performance-mode=mutagen — Aktiviert Mutagen-Dateisynchronisation für deutlich bessere Datei-Performance unter macOS/Windows.
ddev config global --performance-mode=mutagenddev config global --simple-formatting=true — Deaktiviert farbige/gerahmte Tabellenausgabe für einfacheres Terminal-Logging.
ddev config global --simple-formatting=trueddev hostname --list — Listet alle aktuell von DDEV in /etc/hosts verwalteten Hostnamen auf.
ddev hostname --listSSL & HTTPS
mkcert -install — Installiert die mkcert-Root-CA. Einmalig nach der Installation von mkcert ausführen. Für vertrauenswürdiges HTTPS in DDEV erforderlich.
mkcert -installddev config --use-dns-when-possible=true — Nutzt DNS zur Hostnamen-Auflösung statt /etc/hosts (erfordert Internetzugang).
ddev config --use-dns-when-possible=trueddev exec curl -sI https://localhost — Testet die HTTPS-Verbindung im Container.
ddev exec curl -sI https://localhostddev debug router-nginx-config — Zeigt die generierte nginx-Router-Konfiguration zur Fehlersuche bei HTTPS/Routing-Problemen.
ddev debug router-nginx-configDebugging & Profiling
ddev xdebug on — Aktiviert Xdebug im Web-Container für Step-Debugging.
ddev xdebug onddev xdebug off — Deaktiviert Xdebug (wird beim Container-Neustart wieder aktiv, sofern nicht in der Konfiguration gesetzt).
ddev xdebug offddev xdebug status — Zeigt an, ob Xdebug derzeit aktiviert oder deaktiviert ist.
ddev xdebug statusddev config --xdebug-enabled=true — Aktiviert Xdebug dauerhaft für dieses Projekt (bleibt über Neustarts hinweg erhalten).
ddev config --xdebug-enabled=trueddev xhprof on — Aktiviert den xhprof-PHP-Profiler. Die Profiler-UI ist über die DDEV-URL erreichbar.
ddev xhprof onddev xhprof off — Deaktiviert den xhprof-Profiler.
ddev xhprof offddev debug nfsmount — Testet, ob NFS korrekt funktioniert (macOS-NFS-Performance-Modus).
ddev debug nfsmountddev debug test — Führt eine Reihe von Selbsttests aus, um DDEVs Konfiguration und Umgebung zu prüfen.
ddev debug testEigene Befehle & Hooks
ddev <custom-command> — Führt einen eigenen Befehl aus, definiert in .ddev/commands/web/ oder .ddev/commands/host/.
ddev deployddev artisan <command> — Führt Laravel Artisan über einen eigenen DDEV-Befehl aus (falls als Add-on konfiguriert).
ddev artisan migrate:fresh --seedddev craft <command> — Führt Craft-CMS-CLI-Befehle im Container aus.
ddev craft migrate/allddev drush <command> — Führt Drush (Drupal-CLI) im Container aus.
ddev drush crddev wp <command> — Führt WP-CLI-Befehle im Container aus (bei WordPress-Projekttyp).
ddev wp plugin listddev typo3 <command> — Führt TYPO3-Console-Befehle im Container aus.
ddev typo3 cache:flushAufräumen & Wartung
ddev clean — Entfernt temporäre Docker-Images und -Container, die zu keinem Projekt gehören.
ddev cleanddev clean --all — Entfernt alle DDEV-Docker-Images, -Container und -Netzwerke. Vollständige Bereinigung.
ddev clean --allddev self-upgrade — Aktualisiert DDEV auf die neueste Version (bei Installation per self-upgrade-Methode).
ddev self-upgradeddev pull <provider> — Holt Datenbank und/oder Dateien von einem konfigurierten Remote-Provider (z. B. Pantheon, Acquia, Platform.sh).
ddev pull pantheonddev push <provider> — Überträgt Datenbank und/oder Dateien an einen konfigurierten Remote-Provider.
ddev push acquiaddev mutagen reset — Setzt die Mutagen-Sync-Sitzung zurück (macOS/Windows-Performance-Modus). Nutzen, wenn die Synchronisation aus dem Tritt gerät.
ddev mutagen resetddev mutagen monitor — Überwacht den Mutagen-Sync-Status in Echtzeit.
ddev mutagen monitor Fazit
DDEV nimmt dir die mühsame Einrichtung lokaler Entwicklungsumgebungen ab: Ein ddev config, ein ddev start – und Webserver, Datenbank und PHP laufen reproduzierbar im Container. Weil die komplette Konfiguration im Projekt unter .ddev/ liegt, arbeitet dein ganzes Team mit identischen Versionen, und neue Projektmitglieder sind in Minuten startklar. Wer tiefer einsteigt, kombiniert Add-ons, Mutagen-Sync und eigene Befehle zu einem Workflow, der die Lücke zwischen lokaler Maschine und Produktion spürbar verkleinert.
Weiterführende Links
- DDEV – offizielle Website – Überblick, Download und Blog (englisch)
- DDEV-Dokumentation – vollständige Referenz und Anleitungen (englisch)
- DDEV auf GitHub – Quellcode, Releases und Issue-Tracker (englisch)
Verwandte Kommandos
- docker – die Container-Engine, auf der DDEV aufsetzt
- docker-compose – Multi-Container-Setups deklarativ definieren
- helm – Paketmanager für Kubernetes-Deployments