Cómo usar el comando docker container stop para detener contenedores correctamente

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás cómo detener contenedores Docker de manera elegante utilizando el comando docker container stop. Comenzaremos creando y ejecutando un contenedor simple. Luego, explorarás cómo detener contenedores utilizando la señal (signal) y el tiempo de espera (timeout) predeterminados, y posteriormente aprenderás a personalizar el tiempo de espera y la señal utilizada para detener contenedores. Esta experiencia práctica te proporcionará habilidades útiles para gestionar el ciclo de vida de tus contenedores Docker de manera efectiva.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") subgraph Lab Skills docker/run -.-> lab-555124{{"Cómo usar el comando docker container stop para detener contenedores correctamente"}} docker/ps -.-> lab-555124{{"Cómo usar el comando docker container stop para detener contenedores correctamente"}} docker/stop -.-> lab-555124{{"Cómo usar el comando docker container stop para detener contenedores correctamente"}} docker/pull -.-> lab-555124{{"Cómo usar el comando docker container stop para detener contenedores correctamente"}} end

Crear y ejecutar un contenedor simple

En este paso, aprenderás cómo crear y ejecutar un contenedor Docker simple. Un contenedor es una unidad estándar de software que empaqueta código y todas sus dependencias para que la aplicación se ejecute de manera rápida y confiable en diferentes entornos de computación.

Primero, descarguemos una imagen simple de Docker Hub. Usaremos la imagen hello-world, que es una imagen muy pequeña que simplemente imprime un mensaje y finaliza.

docker pull hello-world

Deberías ver una salida que indica que la imagen se está descargando.

Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Ahora que tenemos la imagen, podemos ejecutar un contenedor basado en ella. Usa el comando docker run:

docker run hello-world

Cuando ejecutes este comando, Docker creará un nuevo contenedor a partir de la imagen hello-world. El contenedor ejecutará el comando definido en la imagen, que en este caso es imprimir un mensaje en la consola.

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Esta salida confirma que tu instalación de Docker funciona correctamente y que has ejecutado tu primer contenedor con éxito. El contenedor ejecutó el programa hello-world y luego finalizó.

Para ver los contenedores que se han ejecutado, incluyendo aquellos que han finalizado, puedes usar el comando docker ps -a:

docker ps -a

Deberías ver el contenedor hello-world listado con un estado de Exited.

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                      PORTS     NAMES
<container_id>   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             <container_name>

La salida muestra el ID del contenedor, la imagen en la que se basó, el comando que ejecutó, cuándo fue creado, su estado actual y el nombre asignado.

Detener el contenedor usando la señal y tiempo de espera predeterminados

En este paso, aprenderás cómo detener un contenedor Docker en ejecución utilizando la señal y tiempo de espera predeterminados. Cuando detienes un contenedor, Docker envía una señal al proceso principal que se ejecuta dentro del contenedor. Por defecto, Docker envía la señal SIGTERM, que indica al proceso que se cierre de manera ordenada. Si el proceso no termina dentro del período de tiempo de espera predeterminado (normalmente 10 segundos), Docker envía una señal SIGKILL para forzar la terminación del proceso.

Primero, ejecutemos un contenedor que permanecerá activo. Usaremos la imagen ubuntu y ejecutaremos un comando simple que mantendrá el contenedor en funcionamiento.

docker pull ubuntu

Deberías ver una salida que indica que la imagen ubuntu se está descargando.

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Ahora, ejecuta el contenedor ubuntu en modo desatendido (-d) para que se ejecute en segundo plano, y ejecuta un comando que lo mantendrá funcionando indefinidamente (por ejemplo, tail -f /dev/null).

docker run -d ubuntu tail -f /dev/null

Este comando mostrará el ID del contenedor.

<container_id>

Puedes verificar que el contenedor está en ejecución usando el comando docker ps:

docker ps

Deberías ver el contenedor ubuntu listado con un estado de Up.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Ahora, detengamos este contenedor en ejecución usando el comando docker stop. Puedes usar tanto el ID del contenedor como su nombre. Reemplaza <container_id> con el ID real de tu contenedor en ejecución.

docker stop <container_id>

El comando mostrará el ID del contenedor que fue detenido.

<container_id>

Después de ejecutar el comando docker stop, el contenedor recibirá la señal SIGTERM. Docker esperará el tiempo de espera predeterminado (10 segundos) para que el contenedor se detenga ordenadamente. Si no se detiene en ese tiempo, enviará SIGKILL.

Puedes verificar que el contenedor se ha detenido ejecutando docker ps nuevamente.

docker ps

El contenedor ubuntu ya no debería aparecer en la salida de docker ps (que solo muestra contenedores en ejecución). Para ver todos los contenedores, incluidos los detenidos, usa docker ps -a.

docker ps -a

Deberías ver el contenedor ubuntu listado con un estado de Exited.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

Esto confirma que el contenedor se detuvo exitosamente usando la señal y tiempo de espera predeterminados.

Detener el contenedor con un tiempo de espera personalizado

En este paso, aprenderás cómo detener un contenedor Docker en ejecución especificando un tiempo de espera personalizado para el cierre ordenado. Esto es útil cuando necesitas darle a tu aplicación más o menos tiempo para cerrarse correctamente antes de que Docker la termine forzosamente.

Utilizaremos la misma imagen ubuntu y comando del paso anterior para ejecutar un contenedor que permanece activo.

Primero, ejecuta el contenedor ubuntu en modo desatendido (-d) con el comando tail -f /dev/null:

docker run -d ubuntu tail -f /dev/null

Este comando mostrará el ID del contenedor.

<container_id>

Verifica que el contenedor esté en ejecución usando docker ps:

docker ps

Deberías ver el contenedor ubuntu listado con un estado de Up.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Ahora, detén el contenedor usando el comando docker stop, pero esta vez especifica un tiempo de espera usando la bandera -t o --time. Establezcamos el tiempo de espera en 5 segundos. Reemplaza <container_id> con el ID real de tu contenedor en ejecución.

docker stop -t 5 <container_id>

El comando mostrará el ID del contenedor que fue detenido.

<container_id>

Cuando usas docker stop -t 5, Docker envía la señal SIGTERM y espera 5 segundos para que el contenedor se detenga. Si el contenedor sigue en ejecución después de 5 segundos, Docker enviará la señal SIGKILL.

Verifica que el contenedor se haya detenido ejecutando docker ps -a:

docker ps -a

Deberías ver el contenedor ubuntu listado con un estado de Exited.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (0) About a minute ago             <container_name>

Has detenido exitosamente el contenedor con un tiempo de espera personalizado de 5 segundos.

Detener el contenedor con una señal personalizada

En este paso, aprenderás cómo detener un contenedor Docker en ejecución enviando una señal específica diferente a la predeterminada SIGTERM. Esto puede ser útil para aplicaciones configuradas para responder a diferentes señales para un cierre ordenado u otras acciones.

Nuevamente usaremos la imagen ubuntu y el comando tail -f /dev/null para mantener un contenedor en ejecución.

Ejecuta el contenedor ubuntu en modo desatendido (-d):

docker run -d ubuntu tail -f /dev/null

Este comando mostrará el ID del contenedor.

<container_id>

Verifica que el contenedor esté en ejecución usando docker ps:

docker ps

Deberías ver el contenedor ubuntu listado con un estado de Up.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Up About a minute ago             <container_name>

Ahora, detén el contenedor usando el comando docker stop, y especifica una señal personalizada usando la bandera --signal. Por ejemplo, enviemos directamente la señal SIGKILL. Reemplaza <container_id> con el ID real de tu contenedor en ejecución.

docker stop --signal SIGKILL <container_id>

El comando mostrará el ID del contenedor que fue detenido.

<container_id>

Cuando usas docker stop --signal SIGKILL, Docker envía la señal SIGKILL inmediatamente al proceso principal del contenedor. Esta señal no puede ser capturada o ignorada por el proceso, por lo que terminará forzosamente sin período de cierre ordenado.

Verifica que el contenedor se haya detenido ejecutando docker ps -a:

docker ps -a

Deberías ver el contenedor ubuntu listado con un estado de Exited.

CONTAINER ID   IMAGE     COMMAND               CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu    "tail -f /dev/null"   About a minute ago   Exited (137) About a minute ago             <container_name>

Nota que el código de salida puede ser diferente (ej. 137) cuando un contenedor se detiene con SIGKILL, ya que esto indica una terminación no ordenada.

Has detenido exitosamente el contenedor enviando una señal personalizada.

Resumen

En este laboratorio, aprendiste los pasos fundamentales para trabajar con contenedores Docker. Comenzaste descargando una imagen simple (hello-world) desde Docker Hub y luego ejecutaste un contenedor basado en esa imagen. Esto demostró el proceso básico de creación y ejecución de un contenedor, y verificaste su finalización exitosa comprobando el estado del contenedor usando docker ps -a.

Los pasos posteriores, aunque no están completamente detallados en el contenido proporcionado, te habrían guiado a través del proceso de detener contenedores en ejecución usando el comando docker container stop. Esto habría incluido comprender la señal y el tiempo de espera predeterminados utilizados para detenerlos, y luego explorar cómo personalizar tanto la duración del tiempo de espera como la señal enviada al contenedor para lograr un cierre ordenado.