Ya sabes describir una aplicación multi-contenedor en un archivo docker-compose.yml. Ahora toca aprender a operarla: arrancarla, detenerla, inspeccionar su estado, leer sus registros y entrar dentro de sus contenedores para depurar. Docker Compose ofrece un conjunto compacto de comandos que cubren todo el ciclo de vida de una aplicación. En esta lección los recorreremos uno a uno con ejemplos prácticos, presentaremos una tabla resumen para que la tengas siempre a mano y mostraremos el ciclo de trabajo típico que seguirás en tu día a día como desarrollador.
Objetivos de Aprendizaje
- Dominar los comandos esenciales:
up,down,ps,logs,exec,build,stop/startyrestart. - Entender la diferencia entre arrancar en primer plano y en segundo plano (
-d). - Saber distinguir entre
down(eliminar) ystop(solo detener). - Inspeccionar el estado y los registros de tus servicios.
- Interiorizar un ciclo de trabajo eficaz con Compose.
Nota: todos los comandos se ejecutan desde la carpeta donde está tu
docker-compose.yml, ya que Compose lo busca en el directorio actual.
Arrancar la Aplicación: up
docker compose up es el comando central. Lee el archivo, crea las redes y volúmenes necesarios, construye o descarga las imágenes y arranca todos los servicios.
- Arranca todo en primer plano: la terminal queda ocupada mostrando los registros combinados de todos los servicios. Para detenerlo, pulsa
Ctrl+C.
Lo más habitual es usar el modo detached (segundo plano):
-d(detached): arranca los servicios en segundo plano y te devuelve el control de la terminal. La aplicación sigue corriendo aunque cierres la ventana.
Si has cambiado el código y quieres forzar la reconstrucción de las imágenes antes de arrancar:
--build: reconstruye las imágenes de los servicios que usanbuildantes de levantar los contenedores. Imprescindible tras modificar tuDockerfileo tu código.
Apagar la Aplicación: down
docker compose down es la operación inversa a up: detiene y elimina los contenedores y la red por defecto creados por Compose.
- Para y borra los contenedores y la red asociada.
- Por defecto conserva los volúmenes con nombre, de modo que tus datos persistentes no se pierden.
Si además quieres eliminar los volúmenes (¡cuidado, borra los datos!):
-v: elimina también los volúmenes con nombre declarados en el archivo. Úsalo solo cuando quieras empezar de cero, porque destruye los datos.
downvsstop:downelimina contenedores y red (deja de existir);stopsolo los detiene (siguen existiendo y se pueden reiniciar constart). Veremosstop/startmás adelante.
Ver el Estado: ps
docker compose ps muestra el estado de los servicios de la aplicación actual.
- Lista cada contenedor con su nombre, la imagen, el estado (
running,exited, etc.) y los puertos publicados. - Solo muestra los contenedores definidos en el
docker-compose.ymldel directorio actual, lo que lo hace más claro quedocker ps.
Para ver también los contenedores detenidos, añade -a:
Leer los Registros: logs
docker compose logs muestra la salida (registros) de los servicios, muy útil para depurar.
- Imprime los registros combinados de todos los servicios.
Para seguir los registros en tiempo real, como un tail continuo:
-f(follow): mantiene la salida abierta y muestra los nuevos registros según se producen. Detén conCtrl+C.
Puedes filtrar por un servicio concreto indicando su nombre:
- Muestra solo los registros del servicio
web, en tiempo real.
Entrar en un Contenedor: exec
docker compose exec ejecuta un comando dentro de un contenedor que ya está en marcha. Es la forma estándar de depurar y de abrir una shell interactiva.
Explicación:
web: el nombre del servicio en cuyo contenedor quieres entrar.sh: el comando a ejecutar. Aquí abrimos una shell, lo que te da una terminal dentro del contenedor.- Algunas imágenes incluyen
bashen lugar desh; en ese caso usadocker compose exec web bash.
También puedes ejecutar comandos puntuales sin abrir una shell interactiva:
- Entra directamente al cliente
psqlde PostgreSQL dentro del serviciodb, conectando con el usuario y la base de datos indicados.
Construir Imágenes: build
docker compose build construye (o reconstruye) las imágenes de los servicios que tienen la clave build, sin arrancarlos.
- Construye todas las imágenes definidas con
build. - Útil cuando quieres preparar las imágenes por separado del arranque.
Para forzar una reconstrucción completa ignorando la caché:
--no-cache: reconstruye desde cero sin usar las capas cacheadas. Útil cuando sospechas que la caché está dándote una versión antigua.
Detener y Reanudar: stop, start y restart
A diferencia de down, estos comandos no eliminan los contenedores, solo cambian su estado de ejecución.
# Detener los servicios (sin eliminarlos)
docker compose stop
# Reanudar servicios previamente detenidos
docker compose start
# Reiniciar (parar y volver a arrancar)
docker compose restartExplicación:
stop: detiene los contenedores pero los conserva. Es como apagar sin desinstalar. Más rápido quedownsi solo quieres pausar.start: vuelve a poner en marcha los contenedores que detuviste constop. No sirve para contenedores que ya no existen (para eso usaup).restart: equivale a unstopseguido de unstart. Muy práctico para aplicar cambios de configuración sin recrear nada.
Todos admiten el nombre de un servicio para actuar solo sobre él:
- Reinicia únicamente el servicio
web, dejando el resto intacto.
Tabla Resumen de Comandos
| Comando | Qué hace | Opciones frecuentes |
|---|---|---|
docker compose up |
Crea y arranca todos los servicios | -d (segundo plano), --build (reconstruir) |
docker compose down |
Detiene y elimina contenedores y red | -v (borrar también volúmenes) |
docker compose ps |
Muestra el estado de los servicios | -a (incluir detenidos) |
docker compose logs |
Muestra los registros | -f (seguir en vivo), <servicio> |
docker compose exec |
Ejecuta un comando en un contenedor activo | <servicio> <comando> |
docker compose build |
Construye las imágenes | --no-cache |
docker compose stop |
Detiene sin eliminar | <servicio> |
docker compose start |
Reanuda contenedores detenidos | <servicio> |
docker compose restart |
Reinicia los servicios | <servicio> |
Ciclo de Trabajo Típico
En el día a día, un flujo habitual con Compose se parece a este:
# 1. Arrancar la aplicación en segundo plano
docker compose up -d
# 2. Comprobar que todos los servicios están "running"
docker compose ps
# 3. Seguir los registros para detectar errores
docker compose logs -f
# 4. (En otra terminal) Entrar a un contenedor a depurar
docker compose exec web sh
# 5. Tras cambiar el código, reconstruir y relanzar
docker compose up -d --build
# 6. Al terminar la jornada, detener sin perder datos
docker compose stop
# 7. Para limpiar del todo cuando ya no lo necesitas
docker compose downResumen del flujo:
- Arrancas con
up -dy verificas conps. - Diagnosticas con
logs -fyexec. - Iteras sobre tu código con
up -d --build. - Pausas con
stop(rápido, conserva todo) o limpias condown(elimina contenedores y red).
Errores Comunes y Consejos
- Confundir
downconstop:downelimina los contenedores y la red;stopsolo los pausa. Si quieres reanudar luego, usastop/start; si quieres limpiar, usadown. - Perder datos con
down -v: la opción-vborra los volúmenes y, con ellos, los datos de tus bases de datos. Úsala con plena conciencia. - Olvidar
--buildtras cambiar el código: si no reconstruyes, Compose seguirá usando la imagen antigua y no verás tus cambios. - Ejecutar comandos desde la carpeta equivocada: Compose busca el
docker-compose.ymlen el directorio actual; si no lo encuentra, fallará. - Usar
startcon contenedores inexistentes:startsolo reanuda contenedores que existen pero están detenidos. Si ya hicistedown, debes volver aup. - Consejo: deja
docker compose logs -fcorriendo en una terminal mientras desarrollas; es la forma más rápida de enterarte de cualquier error en cuanto ocurre.
Ejercicios
Ejercicio 1
Arranca una aplicación Compose en segundo plano, comprueba que sus servicios están en ejecución y muestra los registros del servicio db en tiempo real.
Ejercicio 2
Has modificado el código de tu servicio api. Escribe el comando que reconstruye su imagen y relanza la aplicación en segundo plano en un solo paso. Luego explica la diferencia entre docker compose stop y docker compose down.
Ejercicio 3
Abre una shell interactiva dentro del contenedor del servicio web para inspeccionar sus archivos.
Soluciones
Solución al Ejercicio 1
up -darranca en segundo plano.psconfirma que los servicios están en estadorunning.logs -f dbsigue en tiempo real los registros del serviciodb.
Solución al Ejercicio 2
La opción --build fuerza la reconstrucción de las imágenes (incluida la de api) y -d la levanta en segundo plano, todo en un único comando.
Diferencia entre stop y down:
stop: detiene los contenedores pero los conserva; puedes reanudarlos constart. No elimina la red ni los volúmenes.down: detiene y elimina los contenedores y la red por defecto. Los contenedores dejan de existir y, para volver a tenerlos, hay que ejecutarupde nuevo.
Solución al Ejercicio 3
Esto abre una shell (sh) dentro del contenedor en ejecución del servicio web. Si la imagen incluye Bash, también puedes usar docker compose exec web bash. Para salir, escribe exit.
Conclusión
En esta lección has aprendido a operar tus aplicaciones Compose con los comandos esenciales: arrancar con up (y su modo -d), apagar y limpiar con down, inspeccionar el estado con ps, leer registros con logs, depurar con exec, construir imágenes con build y controlar la ejecución con stop, start y restart. La tabla resumen y el ciclo de trabajo típico te servirán de referencia rápida cada vez que trabajes con Compose.
En la siguiente lección, Aplicaciones Multi-Contenedor, juntaremos todo lo aprendido para construir, paso a paso, una aplicación real completa con servicio web, base de datos y caché, viendo cómo se comunican los servicios entre sí por su nombre y cómo orquestar su arranque de principio a fin.
Docker: De Principiante a Avanzado
Módulo 1: Introducción a Docker
- ¿Qué es Docker?
- Instalando Docker
- Arquitectura de Docker
- Comandos Básicos de Docker
- Entendiendo las Imágenes de Docker
- Creando tu Primer Contenedor Docker
Módulo 2: Trabajando con Imágenes Docker
- Docker Hub y Repositorios
- Construyendo Imágenes Docker
- Conceptos Básicos de Dockerfile
- Gestionando Imágenes Docker
- Etiquetado y Publicación de Imágenes
Módulo 3: Contenedores Docker
- Ejecutando Contenedores
- Ciclo de Vida del Contenedor
- Gestionando Contenedores
- Redes en Docker
- Persistencia de Datos con Volúmenes
Módulo 4: Docker Compose
- Introducción a Docker Compose
- Definiendo Servicios en Docker Compose
- Comandos de Docker Compose
- Aplicaciones Multi-Contenedor
- Variables de Entorno en Docker Compose
Módulo 5: Conceptos Avanzados de Docker
- Profundización en Redes Docker
- Opciones de Almacenamiento Docker
- Mejores Prácticas de Seguridad en Docker
- Optimizando Imágenes Docker
- Registro y Monitoreo en Docker
Módulo 6: Docker en Producción
- CI/CD con Docker
- Orquestando Contenedores con Docker Swarm
- Introducción a Kubernetes
- Desplegando Contenedores Docker en Kubernetes
- Escalado y Balanceo de Carga
