Dominá el ciclo de vida de tus contenedores: Guía completa de docker stop, start, restart y rm

DUGLAS MORENODUGLAS MORENO 👁 21
🎧 Escuchá el resumen · 0:59

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:

  1. Envía una señal SIGTERM al proceso principal (PID 1) del contenedor.
  2. 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.
  3. 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-servidor

Salida esperada:

mi-servidor

Si 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 ps

Salida esperada:

CONTAINER ID   IMAGE     COMMAND                  STATUS          PORTS
a1b2c3d4e5f6   nginx     "" "/docker-entrypoint.…"   Up 2 seconds    80/tcp

3. 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-servidor

Salida esperada:

mi-servidor

4. 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-servidor

Salida esperada:

mi-servidor

El 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-servidor

Salida esperada:

mi-servidor

Ahora, 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
rm -f Fuerza la eliminación Envía SIGKILL (muerte súbita)

Buenas prácticas y errores comunes

Para que seas un pro manejando Docker, anotate estos consejos:

  1. 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.
  2. 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 usar docker container prune.
  3. 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.
  4. Ojo con los volúmenes: Recordá que docker rm borra 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!

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario