Generador de Docker Compose
Rellena un formulario y obtén un docker-compose.yml limpio y válido mientras escribes. Empieza con un stack predefinido como WordPress + MySQL o Node.js + PostgreSQL + Redis y luego añade servicios, puertos, volúmenes, variables de entorno, dependencias y healthchecks.
Última actualización:
Cómo usar Generador de Docker Compose
- Elige una plantilla como WordPress + MySQL y haz clic en Cargar plantilla, o empieza con la plantilla en blanco.
- Edita cada servicio: define la imagen (o un contexto de build), la política de reinicio, los puertos, los volúmenes y las variables de entorno.
- Conecta los servicios entre sí con depends_on y elige si esperar a que una dependencia se haya iniciado o esté sana.
- Añade healthchecks a las bases de datos y cachés para que los servicios dependientes solo se inicien cuando estén listos.
- Corrige los avisos que aparecen debajo del YAML, como un puerto del host usado dos veces o una imagen que falta.
- Copia o descarga docker-compose.yml y ejecuta
docker compose up -den la misma carpeta.
Anatomía de un docker-compose.yml
Un archivo Compose tiene una sección obligatoria, services, y dos opcionales que este generador rellena por ti: volumes (volúmenes con nombre que usa cualquier servicio) y networks (redes personalizadas). Cada servicio se convierte en un contenedor en la misma red del proyecto, y los servicios se comunican entre sí por su nombre: un contenedor de WordPress se conecta a su base de datos en db:3306, no en localhost.
| Clave | Qué hace | Ejemplo |
|---|---|---|
image | Imagen que se descarga y ejecuta; fija una etiqueta para builds reproducibles | postgres:16-alpine |
build | Carpeta con un Dockerfile para compilar en lugar de descargar | . |
ports | Publica un puerto del contenedor en el host como HOST:CONTAINER | "8080:80", "127.0.0.1:5432:5432" |
volumes | Volumen con nombre o bind mount; añade :ro para solo lectura | db_data:/var/lib/mysql |
environment | Variables que se pasan al contenedor; una clave sin valor se toma de tu shell | TZ: UTC |
env_file | Carga variables desde un archivo que queda fuera del control de versiones | .env |
depends_on | Orden de inicio, con la opción de esperar a que una dependencia esté sana (healthy) | condition: service_healthy |
restart | Política de reinicio: no, always, on-failure, unless-stopped | unless-stopped |
healthcheck | Comando que ejecuta Docker para decidir si el contenedor está sano | test: ["CMD", "redis-cli", "ping"] |
networks | Conecta a redes personalizadas para aislar capas (frontend / backend) | - backend |
Healthchecks que funcionan con imágenes comunes
Una dependencia marcada como healthy solo sirve si el servicio de destino tiene realmente un healthcheck. Estos comandos usan herramientas incluidas en las imágenes oficiales:
| Imagen | Prueba | Tipo |
|---|---|---|
| postgres | pg_isready -U postgres | CMD-SHELL |
| mysql | mysqladmin ping -h localhost | CMD |
| mariadb (10.4+) | healthcheck.sh --connect --innodb_initialized | CMD |
| redis | redis-cli ping | CMD |
| mongo (6+) | mongosh --quiet --eval "db.adminCommand('ping')" | CMD |
| App web con curl instalado | curl -f http://localhost:3000/health || exit 1 | CMD-SHELL |
Los valores predeterminados de Docker son un intervalo de 30s, un tiempo de espera de 30s, 3 reintentos y ningún periodo inicial. Los intervalos más cortos (5-10s) hacen que docker compose up inicie antes los servicios dependientes; un periodo inicial da tiempo a las bases de datos lentas para inicializarse sin contar fallos.
Comandos de Compose para el día a día
docker compose configvalida el archivo y muestra la configuración completamente resuelta.docker compose up -dcrea e inicia todo en segundo plano;docker compose psmuestra el estado y la salud.docker compose logs -f websigue los registros de un servicio.docker compose downdetiene y elimina los contenedores y las redes; añade-vsolo si también quieres borrar los volúmenes con nombre y sus datos.docker compose pull && docker compose up -dactualiza a imágenes más recientes de las etiquetas que fijaste.
Preguntas frecuentes
¿Qué es un archivo docker-compose.yml?
Es un archivo YAML que describe una aplicación de varios contenedores: qué imágenes ejecutar, qué puertos publicar, qué volúmenes y redes crear y cómo dependen los contenedores entre sí. Al ejecutar docker compose up en la carpeta que lo contiene, se inicia todo el stack con un solo comando.
¿Sigo necesitando la línea version al principio?
No. La Compose Specification que usa Docker Compose v2 ignora la clave version de nivel superior y muestra un aviso de que está obsoleta. No la incluyas salvo que alguna herramienta antigua la siga exigiendo; el generador puede añadir version "3.8" si marcas la opción.
¿Cuál es la diferencia entre un volumen con nombre y un bind mount?
Un volumen con nombre como db_data:/var/lib/mysql lo gestiona Docker y aparece en la sección volumes de nivel superior; es la mejor opción para los datos de una base de datos. Un bind mount como ./src:/var/www/html asigna una carpeta de tu equipo al contenedor, lo que resulta práctico para código fuente y archivos de configuración. El generador detecta los volúmenes con nombre y los declara por ti.
¿Por qué depends_on no espera a que mi base de datos esté lista?
Con la forma corta, Compose solo espera a que el contenedor de la dependencia se inicie, no a que el servicio que contiene acepte conexiones. Añade un healthcheck a la base de datos y define la condición como healthy (service_healthy); así Compose espera a que el healthcheck se supere antes de iniciar el servicio dependiente.
¿Cuál es la diferencia entre CMD y CMD-SHELL en un healthcheck?
CMD ejecuta el programa directamente con los argumentos que indiques, por ejemplo ["CMD", "redis-cli", "ping"]. CMD-SHELL ejecuta toda la cadena a través de /bin/sh del contenedor, así que puedes usar tuberías y || exit 1, por ejemplo ["CMD-SHELL", "pg_isready -U postgres"]. Un código de salida 0 significa sano.
¿Por qué los puertos aparecen entre comillas en el resultado?
Los analizadores YAML 1.1 pueden interpretar valores sin comillas como 22:22 como un número en base 60, lo que rompe la asignación de puertos. Poner entre comillas cada par HOST:CONTAINER como cadena es la práctica recomendada en la documentación de Compose, por eso el generador siempre los entrecomilla.
¿Es seguro poner contraseñas en el archivo?
Las plantillas usan marcadores change-me para que el stack funcione de inmediato. Para despliegues reales, pasa los secretos a un env_file excluido del control de versiones o usa Docker secrets, y nunca subas contraseñas de producción a un repositorio.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.