DDEV


Qué es DDEV

DDEV es una herramienta de desarrollo local basada en Docker que permite crear entornos reproducibles y estandarizados para aplicaciones web (especialmente PHP, Drupal, TYPO3, WordPress, Laravel o Symfony).
Simplifica la configuración del entorno y automatiza la gestión de contenedores, facilitando la colaboración entre equipos y evitando el clásico “funciona en mi máquina”.


Características principales

  • Basado en contenedores: Utiliza Docker para aislar servicios como base de datos, servidor web y PHP.
  • Configuración rápida: Un solo comando (ddev start) levanta el entorno completo.
  • Soporte multisitio: Permite manejar varios proyectos simultáneamente.
  • Certificados HTTPS automáticos generados mediante mkcert.
  • Integración con herramientas de desarrollo como Xdebug, MailHog, phpMyAdmin y Redis.
  • Persistencia de datos: Las bases de datos se conservan entre reinicios de los contenedores.
  • Extensible: Soporta custom commands y hooks en config.yaml.

Arquitectura y componentes

  • Web container: Basado en Apache o Nginx según configuración.
  • PHP container: Ejecuta el intérprete PHP y proporciona acceso a Composer, Xdebug, etc.
  • DB container: Generalmente usa MariaDB o MySQL, aunque se puede configurar PostgreSQL.
  • Router container: Gestiona el enrutamiento y los certificados SSL locales.
  • CLI tools: Permiten ejecutar comandos como composer, npm, o drush dentro del entorno.

Flujo de trabajo básico

  1. Instalar DDEV (brew install ddev o binario directo).
  2. Inicializar un proyecto:
	ddev config
	```

3. Levantar el entorno:
	
```bash
	ddev start
	```

4. Acceder al proyecto en el navegador:
	
```bash
	ddev launch
	```

5. Ejecutar comandos dentro del contenedor:
	
```bash
	ddev ssh
	```

6. Detener el entorno:
	
```bash
	ddev stop
	```


---

## Configuración (`.ddev/config.yaml`)

El archivo principal de configuración define el entorno y sus servicios:


```yaml
name: mi-proyecto
type: php
docroot: web
php_version: "8.2"
router_http_port: "8080"
router_https_port: "8443"
webserver_type: apache-fpm
database:
  type: mariadb
  version: "10.11"
xdebug_enabled: true

`

  • name: Nombre del proyecto.
  • type: Tipo de proyecto (php, drupal, typo3, etc.).
  • docroot: Carpeta pública del proyecto.
  • php_version: Versión de PHP a usar.
  • webserver_type: Servidor web (apache-fpm o nginx-fpm).

Integración con Docker

DDEV no reemplaza a Docker, sino que lo abstrae:

  • Cada proyecto corre en una red separada de Docker.
  • Los contenedores se definen dinámicamente a partir de plantillas de DDEV.
  • Los volúmenes de datos se montan para persistencia (db, uploads, etc.).
  • Se pueden usar imágenes personalizadas o extender servicios con docker-compose.*.yaml.

Ejemplo de extensión personalizada:

# .ddev/docker-compose.redis.yaml
services:
  redis:
    image: redis:7
    container_name: ddev-${DDEV_SITENAME}-redis
    ports:
      - "6379"

Comandos útiles

Comando Descripción
ddev start Inicia los contenedores del proyecto
ddev stop Detiene los contenedores
ddev restart Reinicia los contenedores
ddev delete Elimina contenedores y volúmenes
ddev ssh Abre una shell dentro del contenedor web
ddev exec <cmd> Ejecuta un comando dentro del contenedor
ddev import-db --src=db.sql.gz Importa una base de datos
ddev export-db --file=backup.sql.gz Exporta la base de datos
ddev logs Muestra los logs de los contenedores
ddev describe Detalla la configuración y servicios del entorno

Personalización avanzada

  • Hooks: Automatiza acciones al iniciar o detener DDEV.
  hooks:
    post-start:
      - exec: composer install
  • Custom Commands: Crea comandos personalizados en .ddev/commands/host/.
  # .ddev/commands/host/clear-cache
  #!/bin/bash
  ddev exec drush cr
  • Extensiones: Añade herramientas externas como Solr, Redis, Elasticsearch, MailHog, o Node.js.

Casos de uso comunes

  • Desarrollo local de CMS (Drupal, WordPress, TYPO3).
  • Proyectos PHP modernos (Laravel, Symfony, CraftCMS).
  • Testing y CI/CD local antes del despliegue.
  • Clonación de entornos productivos para debugging.

Comparativa con otras herramientas

Herramienta Base Config Ecosistema Ideal para
DDEV Docker YAML Fuerte (PHP) CMS, PHP apps
Lando Docker YAML Amplio (JS, Python) Fullstack local envs
Docker Compose Docker YAML Genérico DevOps, infra
Vagrant VM Ruby Limitado Legacy o sistemas no containerizados

Buenas prácticas

  • Versionar .ddev/config.yaml pero no los archivos generados.
  • Usar .env o config.local.yaml para variables sensibles.
  • Mantener versiones consistentes de PHP y DB entre entornos.
  • Hacer ddev restart tras cambios en configuración.
  • Limpiar contenedores antiguos con ddev delete --omit-snapshot.

Recursos

DDEV — conceptos avanzados y prácticas extendidas


Integración con entornos externos

Sincronización con entornos remotos

DDEV permite clonar y sincronizar entornos productivos o de staging para depuración o desarrollo local:

ddev pull database
ddev pull files

`

Estas operaciones dependen de providers configurados en .ddev/providers/, como platform.sh, pantheon, o acquia. Esto automatiza la descarga de la base de datos y archivos del servidor remoto hacia el entorno local.

Despliegue inverso

Con ddev push, es posible enviar datos locales hacia un entorno remoto, útil en flujos controlados de staging.


Integración con herramientas de desarrollo

  • Xdebug y Blackfire: se habilitan fácilmente con ddev xdebug on o configurando en config.yaml. Permiten profiling, debugging remoto y trazas de rendimiento.
  • MailHog: intercepta correos salientes en desarrollo (ddev launch -m).
  • phpMyAdmin y Adminer: se pueden habilitar para administrar bases de datos gráficamente.
  • Node.js y frontend builds: se puede instalar dentro del contenedor o usar una extensión:
  ddev get ddev/ddev-nodejs

Integración con CI/CD

DDEV puede formar parte de pipelines de integración continua, utilizando contenedores efímeros que replican el entorno local. Ejemplo con GitHub Actions:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Install DDEV
        run: curl -fsSL https://ddev.com/install.sh | bash
      - name: Start DDEV
        run: ddev start
      - name: Run Tests
        run: ddev exec phpunit

Esto garantiza entornos consistentes entre desarrollo local y CI.


Rendimiento y optimización

  • mutagen: sincroniza archivos entre host y contenedor para mejorar el rendimiento en macOS y Windows. Se activa con:
  ddev mutagen enable
  • Caching: se pueden usar volúmenes persistentes para Composer, npm, y bases de datos.
  • nfs o bind mounts: opcionalmente se pueden usar para mejorar la velocidad de E/S.

Extensiones y add-ons

DDEV permite instalar add-ons comunitarios directamente:

ddev get <github-repo>

Ejemplos:

  • ddev/ddev-redis → añade Redis.
  • ddev/ddev-drupal-solr → añade Apache Solr para búsquedas.
  • ddev/ddev-xhprof → profiling de rendimiento.
  • ddev/ddev-nodejs → integra Node.js y npm dentro del contenedor.

Los add-ons se almacenan en .ddev/addons y pueden versionarse junto al proyecto.


Seguridad y redes

  • Certificados SSL locales generados automáticamente con mkcert.
  • Red privada interna: cada proyecto tiene su propia red Docker aislada.
  • Autenticación local: se pueden definir credenciales personalizadas en variables de entorno.
  • Firewall del host: se recomienda mantener bloqueos de puertos externos y exponer solo los necesarios (router_http_port, router_https_port).

Migración de proyectos existentes

Para adaptar un proyecto ya existente:

  1. Mover el código fuente al directorio deseado.
  2. Ejecutar ddev config y seleccionar el tipo de proyecto.
  3. Ajustar docroot, php_version y database según el entorno original.
  4. Importar base de datos:
   ddev import-db --src=backup.sql.gz
  1. Iniciar el entorno con ddev start.

Esto permite replicar entornos de servidores legacy o proyectos heredados sin conflictos de dependencias.


DDEV en equipos y colaboración

  • Cada desarrollador puede usar su propio sistema operativo sin diferencias de entorno.
  • Los archivos .ddev se versionan para mantener configuración común.
  • Los datos sensibles se gestionan con .ddev/config.local.yaml (no versionado).
  • Se puede compartir el entorno local con ddev share, generando una URL temporal vía ngrok.

Troubleshooting y debugging

Logs

ddev logs
ddev logs -s web

Permiten inspeccionar errores de Apache, PHP o la base de datos.

Comandos de diagnóstico

ddev describe
ddev debug info
ddev poweroff

Sirven para depurar errores de configuración o conflictos de red.

Limpieza

ddev stop --remove-data
ddev delete --omit-snapshot

Útil para reiniciar entornos corruptos o liberar espacio en disco.


Integración con otros entornos

  • Lando: DDEV puede coexistir en sistemas donde ya se usen otros frameworks locales.
  • Docker Compose: los archivos adicionales se integran automáticamente.
  • Vagrant / Multipass: se pueden combinar en entornos híbridos o para pruebas comparativas.
  • Kubernetes (DDEV-Local-K8s): existen experimentos para desplegar entornos DDEV dentro de clústeres de desarrollo.

Conceptos internos

  • Router: gestiona el tráfico HTTP(S) entre proyectos, implementando balanceo simple.
  • Named volumes: almacenan datos persistentes (base de datos, uploads, configuración).
  • Overlay configuration: los archivos config.*.yaml se combinan para formar la configuración final.
  • Snapshotting: guarda instantáneas automáticas del estado de la base de datos antes de borrar o reiniciar.

Recursos complementarios