Docker Compose: qué es y cómo utilizarlo
Autor: Redacción Domeny.ForSale Publicado
En pocas palabras: Docker Compose es una herramienta para definir y ejecutar aplicaciones compuestas por varios contenedores de Docker. En un solo archivo describes los servicios, su configuración, sus conexiones y dónde se almacenan los datos, y después los pones en marcha con el comando docker compose up. Resulta útil, por ejemplo, cuando un proyecto necesita una aplicación, una base de datos y un panel de administración adicional.
Cómo funciona Docker Compose con Docker
Docker ejecuta programas en contenedores: entornos aislados que incluyen la aplicación y las dependencias que necesita. Un contenedor se crea a partir de una imagen, un paquete preparado que define qué se va a ejecutar. Compose no sustituye a Docker: lo utiliza para gestionar un conjunto de contenedores relacionados.
Sin Compose, puedes iniciar cada contenedor con un comando docker run independiente, indicando manualmente los puertos, las variables de entorno y la red. Compose permite guardar esos ajustes en el archivo compose.yaml. Así, puedes conservar la configuración junto con el código del proyecto y reproducirla en otro ordenador.
El concepto básico es el de servicio, que define un componente concreto del entorno, como una base de datos. Compose crea los contenedores a partir de estas definiciones. Por defecto, también crea una red para el proyecto en la que los servicios pueden encontrarse mediante sus nombres.
Qué contiene el archivo compose.yaml
La configuración se escribe en YAML, un formato de texto que utiliza la sangría para definir la estructura. La sangría debe ser coherente; utiliza espacios, no tabuladores.
Los elementos más habituales son los siguientes:
services: lista de servicios que componen el entorno.image: imagen a partir de la cual se ejecutará el contenedor; como alternativa,buildindica cómo construir una imagen propia.ports: asignación de un puerto del ordenador a un puerto del contenedor, que permite acceder al servicio desde fuera de la red de contenedores.environment: variables de entorno que configuran el programa.volumes: montaje de directorios o volúmenes, es decir, ubicaciones donde los datos se conservan independientemente del ciclo de vida del contenedor.
Que los contenedores estén en marcha no significa que la aplicación funcione correctamente. La base de datos puede necesitar tiempo para inicializarse, y la aplicación debe ser capaz de reintentar la conexión. depends_on puede establecer el orden de arranque, pero en su forma básica no garantiza que el servicio esté listo. Para ello, es necesario configurar adecuadamente la comprobación de estado, denominada healthcheck, y la condición de dependencia.
Ejemplo: PostgreSQL y un panel para gestionar la base de datos
Supongamos que quieres probar PostgreSQL en local sin instalar la base de datos directamente en el sistema. También necesitas el panel Adminer, que permite consultar los datos desde el navegador. Crea un directorio para el proyecto y guarda en él el archivo compose.yaml:
services:
db:
image: postgres:17
environment:
POSTGRES_USER: demo
POSTGRES_PASSWORD: contrasena_local_demo
POSTGRES_DB: demo
volumes:
- db_data:/var/lib/postgresql/data
adminer:
image: adminer:5
ports:
- "127.0.0.1:8080:8080"
volumes:
db_data:
Pon en marcha el entorno desde ese directorio:
docker compose up -d
La opción -d ejecuta los contenedores en segundo plano. En el primer arranque, Docker descargará las imágenes si no están disponibles localmente.
Abre la dirección http://localhost:8080 en el navegador. En el panel, selecciona PostgreSQL e introduce db como servidor, demo como usuario, contrasena_local_demo como contraseña y demo como base de datos. Si la base de datos aún se está inicializando, espera un momento y vuelve a intentar iniciar sesión.
El nombre db funciona dentro de la red de Compose. No utilices localhost en ese campo: desde el contenedor de Adminer, ese nombre se referiría al propio contenedor de Adminer, no a la base de datos. En este ejemplo, PostgreSQL no tiene ningún puerto expuesto en el ordenador, mientras que el panel solo es accesible a través de la interfaz local del ordenador.
Esta configuración sirve para aprender; no es una solución lista para producción. No utilices la contraseña del ejemplo con datos reales ni guardes secretos reales en el repositorio.
Comandos para el trabajo diario
El comando actual es docker compose, con un espacio. La forma docker-compose, que aparece en tutoriales antiguos, corresponde a un método anterior de instalación de la herramienta. Puedes comprobar si Compose está disponible con docker compose version. Si el comando no funciona, consulta el método de instalación para tu sistema en la documentación oficial de Docker.
| Comando | Uso |
|---|---|
docker compose ps | Muestra los contenedores del proyecto y su estado. |
docker compose logs -f | Muestra los registros y sigue los nuevos mensajes. |
docker compose stop | Detiene los contenedores sin eliminarlos. |
docker compose down | Elimina los contenedores y la red del proyecto, pero conserva por defecto los volúmenes con nombre. |
docker compose config | Valida y muestra la configuración resultante. |
Ten cuidado con docker compose down -v: la opción -v también elimina los volúmenes gestionados por el proyecto, por lo que en este ejemplo borrará los datos de la base de datos. Un volumen permite conservar los datos después de eliminar el contenedor, pero no sustituye a una copia de seguridad.
Cuándo basta con Compose y cuándo no
Compose es adecuado para desarrollar aplicaciones en local, realizar pruebas de integración y hacer despliegues sencillos en un único servidor. Es especialmente útil cuando varias personas necesitan ejecutar el mismo conjunto de servicios sin reproducir manualmente los ajustes.
Por sí solo, no permite gestionar un clúster de varios servidores ni proporciona alta disponibilidad. Un despliegue en producción requiere planificar por separado la seguridad, las copias de seguridad, la monitorización y las actualizaciones de las imágenes. Una etiqueta de imagen como postgres:17 puede apuntar a sucesivas versiones de la misma línea. Si necesitas reproducir exactamente el entorno, considera fijar la imagen a un digest concreto, es decir, al identificador de su contenido.
Para empezar, ejecuta el ejemplo, revisa los registros y ejecuta docker compose down, seguido de docker compose up -d. Así comprobarás en la práctica la diferencia entre un contenedor que se vuelve a crear y los datos que se conservan.
