Dominá el ciclo de vida de tus contenedores: Guía completa de docker stop, start, restart y rm
Si alguna vez trabajaste con Docker, seguro te pasó: levantaste un contenedor, te diste cuenta de que algo andaba mal, o simplemente necesitás apagarlo para liberar recursos. En el día a día del desarrollo, no basta con saber cómo hacer un docker run. Tenés que saber cómo gestionar lo que ya está corriendo.
En este post, vamos a meternos de lleno en la gestión de contenedores. Vamos a desmenuzar los comandos stop, start, restart y rm, y te voy a explicar qué pasa realmente "bajo el capó" cuando los ejecutás. Este artículo es para vos si sos desarrollador, DevOps o simplemente alguien que está empezando con la virtualización a nivel de sistema operativo y quiere dejar de adivinar qué hace cada comando.
Entendiendo el ciclo de vida de un contenedor
Antes de tirar comandos a lo loco, tenés que entender que un contenedor no es una máquina virtual eterna. Un contenedor tiene estados: está corriendo (running), está pausado (paused) o está detenido (exited).
Cuando usás Docker, no estás apagando una computadora entera; estás enviando señales a un proceso dentro de un entorno aislado. Esto es clave para entender por qué algunos comandos tardan más que otros.
1. docker stop: El apagado elegante
El comando docker stop es el que deberías usar el 90% de las veces cuando querés detener algo. Pero, ¿por qué "elegante"? Porque no mata el proceso de golpe.
Cuando ejecutás docker stop [ID_o_NOMBRE], Docker hace lo siguiente:
- Envía una señal SIGTERM al proceso principal (PID 1) del contenedor.
- Le da una ventana de tiempo (por defecto 10 segundos) para que el proceso haga su limpieza: cerrar conexiones a bases de datos, guardar archivos pendientes en disco, terminar de procesar una request, etc.
- Si después de ese tiempo el contenedor sigue vivo, recién ahí Docker envía un SIGKILL, que es el apagado forzoso.
Ejemplo práctico de docker stop
Supongamos que tenemos un contenedor corriendo un servidor web simple.
# Primero, levantamos un contenedor de ejemplo
docker run -d --name mi-servidor nginx
# Ahora, lo detenemos
docker stop mi-servidorSalida esperada:
mi-servidorSi después de esto ejecutás docker ps, vas a ver que el contenedor ya no figura en la lista de procesos activos. Pero ojo, ¡el contenedor sigue ahí! No se borró, solo está en estado Exited.
2. docker start: El despertar
Si ya tenés un contenedor detenido (que ya creaste previamente con run o create), no necesitás volver a usar docker run (porque eso crearía uno nuevo). Lo que necesitás es docker start.
Este comando toma un contenedor que está en estado Exited y lo vuelve a poner en estado Running.
Ejemplo práctico de docker start
Siguiendo con nuestro ejemplo anterior:
# El contenedor 'mi-servidor' está detenido. Vamos a despertarlo.
docker start mi-servidor
# Verificamos que esté corriendo
docker psSalida esperada:
CONTAINER ID IMAGE COMMAND STATUS PORTS
a1b2c3d4e5f6 nginx "" "/docker-entrypoint.…" Up 2 seconds 80/tcp3. docker restart: El clásico "apagá y prendé"
¿Sabés ese consejo de "reiniciá la compu a ver si se arregla"? Bueno, en Docker existe docker restart.
Este comando es básicamente un atajo que combina un stop seguido de un start. Es extremadamente útil cuando modificaste un archivo de configuración externo que el contenedor lee al arrancar, o cuando un proceso interno se quedó trabado de una forma que no responde a señales normales pero permite el reinicio.
Ejemplo práctico de docker restart
# Reiniciamos el contenedor de un solo golpe
docker restart mi-servidorSalida esperada:
mi-servidor4. docker rm: Limpieza de archivos y recursos
Acá es donde muchos principiantes meten la pata. docker stop detiene el proceso, pero no borra el contenedor. El contenedor sigue ocupando espacio en tu disco duro con su capa de escritura (writable layer).
Si querés eliminar un contenedor definitivamente de tu sistema, tenés que usar docker rm.
Importante: No podés borrar un contenedor que esté corriendo. Si intentás hacer docker rm mi-servidor mientras está activo, Docker te va a tirar un error.
Ejemplo de eliminación estándar
# Primero lo detenemos
docker stop mi-servidor
# Ahora lo borramos
docker rm mi-servidorSalida esperada:
mi-servidorEl poder (y el peligro) de la opción -f (force)
¿Qué pasa si tenés un contenedor que se colgó, no responde al stop y no querés perder tiempo deteniéndolo manualmente? Ahí entra la bandera --force o -f.
Cuando usás docker rm -f [NOMBRE], Docker no intenta ser amable. Envía directamente un SIGKILL para matar el proceso y elimina el contenedor inmediatamente, sin importar si está corriendo o no.
¡Cuidado! Usar -f es como desenchufar la computadora de la pared. Si el contenedor estaba escribiendo algo importante en el disco, podrías tener corrupción de datos en esa capa de escritura.
Ejemplo de docker rm -f
# Supongamos que 'mi-servidor' está corriendo y no queremos detenerlo formalmente
docker rm -f mi-servidorSalida esperada:
mi-servidorAhora, si ejecutás docker ps -a (para ver todos, incluso los detenidos), vas a ver que ya no existe.
Resumen de comandos y diferencias
Para que no te olvides más, te armé esta tablita comparativa:
| Comando | Acción | ¿Qué pasa con el proceso? | ¿Se borra el contenedor? |
|---|---|---|---|
stop |
Detiene el contenedor | Envía SIGTERM (espera 10s) | No |
start |
Inicia un contenedor detenido | Arranca el proceso principal | No |
restart |
Reinicia el contenedor | Stop + Start | |
| No | |||
rm |
Elimina el contenedor | Solo funciona si está detenido | Sí |
rm -f |
Fuerza la eliminación | Envía SIGKILL (muerte súbita) | Sí |
Buenas prácticas y errores comunes
Para que seas un pro manejando Docker, anotate estos consejos:
- No abuses de
docker rm -f: Siempre que puedas, usádocker stop. La limpieza de recursos (cerrar sockets, flush de buffers) es vital para la integridad de tus apps. - Limpieza periódica: Los contenedores detenidos ocupan espacio. Si ya no los necesitás, usá
docker rm. Si querés borrar todos los contenedores que no están corriendo de un saque, podés usardocker container prune. - Identificá bien tus contenedores: Si tenés muchos contenedores, usar el ID (ej:
a1b2c3d4e5f6) es más seguro que el nombre si este último es genérico. - Ojo con los volúmenes: Recordá que
docker rmborra el contenedor, pero no borra los volúmenes asociados. Si tenés datos persistentes en un volumen, esos datos están a salvo aunque borres el contenedor.
Conclusión
Gestionar contenedores es una de las tareas más básicas pero críticas cuando trabajás con Docker. Entender la diferencia entre detener un proceso de forma amable y matarlo por la fuerza te va a ahorrar muchísimos dolores de cabeza y posibles inconsistencias en tus entornos de desarrollo.
Resumen rápido:
- Querés apagar bien:
stop. - Querés volver a prender algo que paraste:
start. - Querés resetear:
restart. - Querés borrar todo rastro:
rm. - El contenedor no responde y estás apurado:
rm -f.
¿Te sirvió esta guía? Si tenés alguna duda o algún comando de Docker que te esté volviendo loco, ¡dejame un comentario y lo vemos!
DUGLAS MORENO
Comentarios (0)
Sé el primero en comentar.