Cómo usar el comando docker desktop stop para gestionar Docker Desktop

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 a gestionar eficazmente tus contenedores Docker utilizando el comando docker stop. Cubriremos el uso básico para detener un contenedor en ejecución, exploraremos diferentes opciones para controlar el proceso de detención, incluyendo cómo forzar la detención de un contenedor y cómo establecer un tiempo de espera (timeout) para la operación de detención. Al finalizar este laboratorio, serás competente en el uso de docker stop para terminar contenedores Docker de manera elegante (gracefully) o forzada (forcefully).


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-555150{{"Cómo usar el comando docker desktop stop para gestionar Docker Desktop"}} docker/ps -.-> lab-555150{{"Cómo usar el comando docker desktop stop para gestionar Docker Desktop"}} docker/stop -.-> lab-555150{{"Cómo usar el comando docker desktop stop para gestionar Docker Desktop"}} docker/pull -.-> lab-555150{{"Cómo usar el comando docker desktop stop para gestionar Docker Desktop"}} end

Comprender el uso básico de docker stop

En este paso, aprenderemos el uso básico del comando docker stop. Este comando se utiliza para detener uno o más contenedores en ejecución. Por defecto, envía una señal SIGTERM al contenedor y, después de un período de gracia, envía una señal SIGKILL si el contenedor no se ha detenido.

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

docker run -d ubuntu sleep infinity

La bandera -d ejecuta el contenedor en modo desatendido (detached), lo que significa que se ejecuta en segundo plano. sleep infinity es un comando que mantendrá el contenedor ejecutándose indefinidamente.

Ahora, listemos los contenedores en ejecución para obtener el ID del contenedor.

docker ps

Deberías ver una salida similar a esta, mostrando tu contenedor ubuntu en ejecución:

CONTAINER ID   IMAGE          COMMAND           CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <container_name>

Reemplaza <container_id> con el ID real de tu contenedor en ejecución obtenido del comando docker ps. Ahora, detén el contenedor usando el comando docker stop seguido del ID del contenedor.

docker stop <container_id>

Después de ejecutar este comando, el contenedor debería detenerse. Puedes verificarlo listando nuevamente los contenedores en ejecución.

docker ps

Esta vez, el comando docker ps no debería mostrar el contenedor que acabas de detener.

Para ver todos los contenedores, incluidos los que están detenidos, puedes usar la bandera -a con docker ps.

docker ps -a

Esto mostrará el contenedor detenido con un estado Exited.

Detener Docker Desktop utilizando la opción de desacoplamiento (detach)

En este paso, exploraremos cómo detener un contenedor utilizando el concepto de desacoplamiento. Aunque docker stop no tiene una opción de desacoplamiento (detach) como tal, similar a docker run, el comportamiento inherente de este comando permite que al ejecutarlo en la terminal, envíe la señal de detención y devuelva inmediatamente el control a la terminal, permitiéndote continuar con otras tareas.

Comencemos ejecutando otro contenedor que luego detendremos. Esta vez usaremos la imagen nginx. Primero, descarga la imagen si no la tienes localmente.

docker pull nginx

Ahora, ejecuta el contenedor nginx en modo desacoplado.

docker run -d nginx

Obtén el ID del contenedor nginx en ejecución.

docker ps

Verás una salida similar a esta, mostrando tanto el contenedor ubuntu anterior (si no lo eliminaste) como el nuevo contenedor nginx:

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
<nginx_container_id>   nginx          "nginx -g 'daemon off"   X seconds ago   Up X seconds   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         Y minutes ago   Exited Y minutes ago             <ubuntu_container_name>

Ahora, detén el contenedor nginx usando su ID.

docker stop <nginx_container_id>

Cuando ejecutas docker stop, el comando envía la señal de detención y devuelve inmediatamente el control a tu terminal. Este es el comportamiento "desacoplado" desde la perspectiva de tu sesión de terminal - no necesitas esperar a que el contenedor se detenga completamente para poder escribir otro comando.

Verifica que el contenedor nginx se haya detenido.

docker ps

El contenedor nginx ya no debería aparecer en la lista de contenedores en ejecución.

Forzar la detención de Docker Desktop

En este paso, aprenderemos cómo forzar la detención de un contenedor usando el comando docker stop. Aunque docker stop por defecto envía una señal de detención elegante (SIGTERM), a veces un contenedor podría no responder a esta señal y necesita ser detenido forzosamente. Esto se logra mediante el comportamiento predeterminado de docker stop, que envía un SIGKILL después de un tiempo de espera.

Ejecutemos un contenedor que podría ser difícil de detener normalmente. Usaremos nuevamente un contenedor ubuntu, pero esta vez simularemos un proceso que ignora la señal SIGTERM.

docker run -d ubuntu sh -c 'trap "" SIGTERM; sleep infinity'

En este comando:

  • trap "" SIGTERM le indica al shell que ignore la señal SIGTERM
  • sleep infinity mantiene el contenedor en ejecución

Obtengamos el ID de este nuevo contenedor ubuntu.

docker ps

Deberías ver el nuevo contenedor ubuntu en ejecución.

CONTAINER ID   IMAGE          COMMAND                        CREATED         STATUS         PORTS     NAMES
<force_stop_container_id>   ubuntu         "sh -c 'trap \"\" SIGT…"   X seconds ago   Up X seconds             <container_name>
<nginx_container_id>   nginx          "nginx -g 'daemon off"   Y minutes ago   Exited Y minutes ago   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         Z minutes ago   Exited Z minutes ago             <ubuntu_container_name>

Ahora, intentemos detener este contenedor usando el comando estándar docker stop con su ID.

docker stop <force_stop_container_id>

Como el contenedor está ignorando la señal SIGTERM, docker stop esperará el período de gracia predeterminado (normalmente 10 segundos) y luego enviará una señal SIGKILL, que no puede ser ignorada. Esto forzará la detención del contenedor. Puedes notar un ligero retraso antes de que el comando finalice.

Verifica que el contenedor se haya detenido.

docker ps

El contenedor ya no debería aparecer en la lista de contenedores en ejecución.

También puedes especificar explícitamente un tiempo de espera de 0 segundos con la bandera -t para enviar inmediatamente una señal SIGKILL, forzando la detención sin esperar el período de gracia. Exploraremos la bandera -t en el siguiente paso.

Detener Docker Desktop con un tiempo de espera (timeout)

En este paso, aprenderemos cómo detener un contenedor con un tiempo de espera específico usando la bandera -t o --time con el comando docker stop. Esto te permite especificar cuánto tiempo debe esperar Docker para que el contenedor se cierre correctamente después de enviar la señal SIGTERM, antes de detenerlo forzosamente con SIGKILL.

Ejecutemos un contenedor que detendremos con un tiempo de espera. Usaremos la imagen ubuntu y un script que espera una señal antes de salir.

docker run -d ubuntu sh -c 'trap "exit 0" SIGTERM; sleep infinity'

Este comando ejecuta un contenedor ubuntu en modo desacoplado. La parte trap "exit 0" SIGTERM configura una trampa que hará que el script salga correctamente cuando reciba una señal SIGTERM. sleep infinity mantiene el contenedor en ejecución hasta que reciba la señal.

Obtengamos el ID de este nuevo contenedor ubuntu.

docker ps

Deberías ver el nuevo contenedor ubuntu en ejecución.

CONTAINER ID   IMAGE          COMMAND                        CREATED         STATUS         PORTS     NAMES
<timeout_container_id>   ubuntu         "sh -c 'trap \"exit 0\"…"   X seconds ago   Up X seconds             <container_name>
<force_stop_container_id>   ubuntu         "sh -c 'trap \"\" SIGT…"   Y minutes ago   Exited Y minutes ago             <container_name>
<nginx_container_id>   nginx          "nginx -g 'daemon off"   Z minutes ago   Exited Z minutes ago   80/tcp    <nginx_container_name>
<ubuntu_container_id>   ubuntu         "sleep infinity"         A minutes ago   Exited A minutes ago             <ubuntu_container_name>

Ahora, detengamos este contenedor con un tiempo de espera de 5 segundos usando la bandera -t.

docker stop -t 5 <timeout_container_id>

Docker enviará la señal SIGTERM y esperará 5 segundos. Como nuestro contenedor está configurado para salir correctamente con SIGTERM, debería detenerse dentro de este período. Si no se detuviera en 5 segundos, Docker enviaría entonces un SIGKILL.

Verifica que el contenedor se haya detenido.

docker ps

El contenedor ya no debería aparecer en la lista de contenedores en ejecución.

Usar la bandera -t es útil cuando deseas darle a tu contenedor un tiempo específico para realizar operaciones de limpieza antes de ser detenido forzosamente.

Resumen

En este laboratorio, aprendimos el uso fundamental del comando docker stop para gestionar contenedores en ejecución. Comenzamos comprendiendo que docker stop envía una señal SIGTERM seguida de un SIGKILL después de un período de gracia. Practicamos deteniendo un contenedor simple de ubuntu que se ejecutaba en modo desacoplado, identificando su ID de contenedor mediante docker ps y luego ejecutando docker stop <container_id>. Verificamos el estado detenido del contenedor listando nuevamente los contenedores en ejecución y también aprendimos cómo ver todos los contenedores, incluidos los detenidos, usando docker ps -a.