Un contenedor no es algo estático: pasa por distintos estados a lo largo de su existencia, desde que se crea hasta que se elimina. Comprender este ciclo de vida es clave para gestionar tus contenedores con confianza, saber qué les ocurre en cada momento y elegir el comando adecuado para cada situación. En esta lección recorreremos todos los estados posibles de un contenedor, las transiciones entre ellos y los comandos que las provocan, prestando especial atención a una duda muy habitual entre principiantes: la diferencia entre detener (stop) y matar (kill) un contenedor.
Los Estados de un Contenedor
A lo largo de su vida, un contenedor puede encontrarse en uno de varios estados. Conocerlos te ayuda a interpretar lo que ves en docker ps y a saber qué acción tomar.
| Estado | Descripción | ¿Consume CPU/memoria? |
|---|---|---|
| created | El contenedor existe pero nunca se ha arrancado | No |
| running | El contenedor está en ejecución activa | Sí |
| paused | El contenedor está congelado: sus procesos están suspendidos | No (memoria retenida) |
| stopped | El contenedor se detuvo de forma ordenada y puede reiniciarse | No |
| exited | El proceso principal terminó (por sí mismo o porque se detuvo) | No |
| dead | Estado de error; el contenedor no se pudo detener correctamente | No |
Una aclaración importante: en la práctica, los estados stopped y exited aparecen muy relacionados. Cuando detienes un contenedor, su proceso principal termina y Docker lo muestra como Exited en el listado, junto con el código de salida.
Estado created
Ocurre cuando creas un contenedor sin arrancarlo. Esto se hace con docker create en lugar de docker run.
docker create: prepara el contenedor (descarga la imagen, reserva recursos) pero no lo arranca.- El contenedor queda en estado
created, listo para ejecutarse más tarde condocker start.
Estado running
Es el estado normal de un contenedor activo. Se alcanza con docker run (que crea y arranca a la vez) o con docker start sobre un contenedor existente.
Estado paused
Un contenedor pausado tiene todos sus procesos congelados en memoria. No consume CPU, pero sigue ocupando RAM. Es útil para liberar procesador temporalmente sin perder el estado.
Estado exited / stopped
El contenedor ha dejado de ejecutarse. Puede ser porque su programa terminó por sí solo o porque tú lo detuviste. Los datos de su sistema de archivos siguen ahí hasta que lo elimines.
Diagrama de Transiciones
Las transiciones entre estados se provocan con comandos concretos. Esta tabla resume qué comando lleva de un estado a otro.
| Comando | Estado de origen | Estado de destino | Qué hace |
|---|---|---|---|
docker create |
(no existe) | created | Crea el contenedor sin arrancarlo |
docker run |
(no existe) | running | Crea y arranca el contenedor |
docker start |
created/exited | running | Arranca un contenedor existente |
docker stop |
running | exited | Detiene de forma ordenada |
docker kill |
running | exited | Detiene de forma inmediata (forzada) |
docker pause |
running | paused | Congela los procesos del contenedor |
docker unpause |
paused | running | Reanuda los procesos congelados |
docker restart |
running/exited | running | Detiene (si hace falta) y vuelve a arrancar |
docker rm |
exited/created | (no existe) | Elimina el contenedor definitivamente |
Los Comandos de Control en Detalle
Veamos cada comando con ejemplos prácticos.
Arrancar: docker start
Vuelve a poner en marcha un contenedor que estaba detenido o que solo se había creado.
servidor_web: el nombre (o ID) del contenedor a arrancar.- A diferencia de
docker run, no crea un contenedor nuevo: reutiliza el existente, conservando su configuración y datos.
Detener: docker stop
Detiene un contenedor en ejecución de forma ordenada.
- Docker envía la señal
SIGTERMal proceso principal, dándole tiempo para cerrar conexiones, guardar datos y terminar limpiamente. - Si tras un periodo de gracia (10 segundos por defecto) el proceso no ha terminado, Docker envía
SIGKILLpara forzar el cierre.
Puedes ajustar el tiempo de espera:
-t 30: concede 30 segundos antes de forzar el cierre. Útil para aplicaciones que necesitan más tiempo para apagarse con seguridad.
Reiniciar: docker restart
Equivale a un stop seguido de un start en un solo comando.
- Muy práctico para aplicar cambios de configuración o recuperar un servicio que se ha quedado bloqueado.
Pausar y reanudar: docker pause / docker unpause
# Congelar el contenedor
docker pause servidor_web
# Reanudarlo donde se quedó
docker unpause servidor_webpause: suspende todos los procesos del contenedor sin terminarlos. La aplicación deja de responder, pero su estado en memoria se conserva intacto.unpause: reanuda la ejecución exactamente en el punto donde se detuvo.
Matar: docker kill
Detiene un contenedor de forma inmediata y forzada.
- Docker envía directamente la señal
SIGKILL, que termina el proceso al instante, sin periodo de gracia. - El contenedor no tiene oportunidad de cerrar nada limpiamente.
Diferencia Clave: stop frente a kill
Esta es una de las distinciones más importantes que debes interiorizar.
| Aspecto | docker stop |
docker kill |
|---|---|---|
| Señal enviada | SIGTERM y, si hace falta, SIGKILL |
SIGKILL directamente |
| Periodo de gracia | Sí (10 s por defecto) | No |
| Apagado limpio | Sí, la aplicación puede cerrar bien | No, corte abrupto |
| Riesgo de pérdida de datos | Bajo | Mayor (si había escrituras en curso) |
| Cuándo usarlo | Caso normal, día a día | Cuando el contenedor no responde |
En resumen: usa siempre docker stop como opción por defecto. Reserva docker kill para cuando un contenedor está colgado y no responde a stop.
Comprobar el Estado de un Contenedor
Para ver el estado actual de tus contenedores, usa docker ps:
# Contenedores en ejecución
docker ps
# Todos los contenedores, incluidos los detenidos
docker ps -adocker ps: muestra solo los que están enrunning.docker ps -a(all): incluye también los que están encreated,exited, etc. La columnaSTATUSte indica el estado de cada uno.
Errores Comunes y Consejos
- Confundir
runconstart:docker runsiempre crea un contenedor nuevo;docker startreutiliza uno existente. Si hacesrunrepetidamente, acumularás contenedores. - Usar
killpor costumbre: matar contenedores constantemente puede corromper datos. Acostúmbrate astop. - Pensar que un contenedor pausado no consume nada: un contenedor en
pausedlibera CPU, pero sigue reteniendo memoria. - Olvidar
-aal listar: si un contenedor "ha desaparecido", probablemente está detenido. Usadocker ps -apara verlo. - No conceder tiempo suficiente con
stop: si tu aplicación necesita más de 10 segundos para cerrar, ajusta-tpara evitar cortes abruptos. - Consejo: revisa el código de salida (columna
STATUS) de los contenedoresexited; un código distinto de0suele indicar que algo falló.
Ejercicios
Ejercicio 1: recorrer los estados
Crea un contenedor de Nginx sin arrancarlo, comprueba su estado, arráncalo, pausa y reanuda, y finalmente detenlo. Observa el estado en cada paso.
Ejercicio 2: stop frente a kill
Lanza dos contenedores de Nginx. Detén uno con docker stop y el otro con docker kill. Comprueba que ambos terminan, y razona qué diferencia hubo internamente.
Ejercicio 3: reiniciar un servicio
Lanza un contenedor de Nginx, reinícialo con un solo comando y verifica que sigue en ejecución después.
Soluciones
Solución 1
docker create --name ciclo nginx
docker ps -a # Estado: Created
docker start ciclo
docker ps # Estado: Up (running)
docker pause ciclo
docker ps # Estado: Up (Paused)
docker unpause ciclo
docker stop ciclo
docker ps -a # Estado: ExitedCada comando provoca una transición de estado que puedes confirmar con docker ps / docker ps -a.
Solución 2
docker run -d --name ordenado nginx
docker run -d --name forzado nginx
docker stop ordenado # SIGTERM con periodo de gracia
docker kill forzado # SIGKILL inmediato
docker ps -a # Ambos aparecen como Exitedordenado tuvo la oportunidad de cerrarse limpiamente; forzado se cortó de golpe.
Solución 3
docker run -d --name servicio nginx
docker restart servicio
docker ps # Debe aparecer en estado Up de nuevodocker restart equivale a un stop seguido de un start.
Conclusión
En esta lección hemos recorrido el ciclo de vida completo de un contenedor: sus estados (created, running, paused, stopped/exited), las transiciones entre ellos y los comandos que las controlan (start, stop, restart, pause, unpause, kill). Hemos aclarado la diferencia fundamental entre detener (stop, ordenado) y matar (kill, forzado) un contenedor, una distinción que evita pérdidas de datos accidentales.
En la siguiente lección, Gestionando Contenedores, aprenderás a trabajar con ellos en el día a día: listarlos, inspeccionarlos, leer sus logs, entrar en ellos con exec, copiar ficheros y eliminarlos de forma ordenada.
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
