Detén contenedores Docker sin arruinar las cosasDetener contenedores Docker sin.uinar todo

¿Tienes problemas con detener contenedores en Docker? Encontrar la manera correcta de detener un contenedor puede ser complicado, especialmente cuando se pueden crear muchos contenedores diferentes. En este artículo, aprenderás los comandos de Docker para detener un contenedor o todos los contenedores.

Sigue leyendo para obtener más información.

Prerrequisitos

Para seguir este tutorial, asegúrate de tener lo siguiente:

  • Windows 10: este tutorial utiliza Windows para ejecutar Docker, pero también puedes aplicar los mismos pasos generales en Linux o macOS.
  • Docker Desktop: Este tutorial utiliza la versión 3.5.2. El motor de Docker está disponible si estás en Linux, ya que la interfaz gráfica no lo incluye.
  • A running Docker container or containers.

Finalización de Contenedores con el Comando docker stop

Comencemos con el primer comando: el comando docker stop y cómo detiene los contenedores.

Por ejemplo, tal vez necesitas detener un contenedor en ejecución con el nombre mystifying_hofstadter y un ID de fb66ed502096. Como se muestra en el siguiente ejemplo, detén el contenedor con el comando docker stop.

# Detener el contenedor por nombre
docker stop mystifying_hofstadter
# Detener el contenedor por ID (mismo contenedor)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

¿Qué pasa si tienes múltiples contenedores en ejecución y quieres detenerlos? El comando docker stop admite detener múltiples IDs de contenedores, uno a la vez.

Primero, lista todos los contenedores mediante el comando docker ps y pasa los IDs de los contenedores al comando docker stop, como se muestra a continuación.

# Lista todos los contenedores en ejecución
docker ps
# Detén los siguientes contenedores de Docker mediante el ID del contenedor
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

¿Y si deseas detener todos los contenedores en ejecución sin recuperar manualmente los IDs de los contenedores y pasarlos a docker stop? El comando docker ps -q logrará eso. El parámetro -q del comando docker ps solo muestra los IDs de los contenedores.

# Crea tres contenedores. Un punto y coma separa cada comando
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Lista todos los contenedores en ejecución
docker ps -q
# Recupera todos los IDs de contenedores en ejecución y pásalos a docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

La construcción $(docker ps -q) mencionada arriba es una subexpresión tanto en Bash en Linux como en PowerShell en Windows. Una subexpresión indica al shell que procese primero un conjunto de comandos, docker ps -q, y luego devuelva el conjunto de resultados al comando original docker stop.

El comando docker stop utiliza la señal SIGTERM para los contenedores. Las señales de Linux informan a un proceso de un evento, pero depende del proceso decidir cómo actuar ante una señal dada.

Cuando se utiliza la señal SIGTERM, Docker usa la señal para detener un proceso de manera controlada esperando por defecto 10 segundos antes de enviar la señal SIGKILL, que termina el proceso inmediatamente.

Detener un contenedor usando señales de proceso

Ha aprendido sobre el comportamiento predeterminado de Docker (señal de detención) con el comando docker stop para contenedores al detener un contenedor. Pero es posible que no desee el comportamiento predeterminado. En su lugar, puede indicar a Docker que utilice señales de detención alternativas.

Con la bandera --stop-signal de los comandos docker run, puede especificar la señal de detención al iniciar el contenedor. Esta bandera establece la señal que se enviará al contenedor en ejecución cuando desee detenerlo.

En el ejemplo siguiente, la bandera --stop-signal toma el valor SIGQUIT, lo que le indica a Docker que envíe la señal SIGQUIT cuando sea hora de detener el contenedor. El ejemplo también utiliza los siguientes parámetros:

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “nombre de la imagen” – Qué imagen de Docker usar para aprovisionar el contenedor, en este caso, la imagen ubuntu.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

También puedes especificar la señal de parada usando un Dockerfile, que le indica a Docker cómo construir un contenedor. Puedes agregar una entrada al Dockerfile especificando la señal de parada con STOPSIGNAL SIGQUIT, por ejemplo. Puedes cambiar SIGQUIT por cualquier señal de parada que desees.

Saliendo de los contenedores inmediatamente con docker kill

Habrá momentos en los que quieras salir de los contenedores sin permitirles un período de gracia. El comando docker kill detiene inmediatamente un contenedor.

El ejemplo siguiente pasa el contenedor con ID 2aa318273db5 a docker kill. El contenedor saldrá inmediatamente a través de la señal SIGKILL. Al contenedor no se le permitirá una salida elegante. Como resultado del comando, el contenedor saldrá y se mostrará el ID del contenedor.

docker kill 2aa318273db5

Matar todos los contenedores con el comando docker kill $(docker ps -q). Observa que (docker ps -q) es una subexpresión aquí.

Deteniendo y eliminando un contenedor con docker rm

De forma predeterminada, cuando creas un contenedor, ese contenedor se construye de la misma manera que antes: es idempotente. Eliminar un contenedor tendrá un impacto mínimo, y teniendo eso en cuenta, docker rm puede forzar detener y eliminar un contenedor. Docker emite una señal SIGKILL al proceso principal y elimina el contenedor de la lista de contenedores disponibles en tu instalación de Docker.

Si el contenedor debe mantener los archivos internos modificados o se debe mantener su estado, entonces eliminar un contenedor destruirá esos cambios. ¡Ten cuidado con posibles desastres!

En el siguiente ejemplo, tal vez hayas iniciado un contenedor al que se le asignó el nombre kind_galileo. Antes de eliminar un contenedor, el contenedor debe detenerse, como se muestra a continuación. El comando docker ps -a muestra el estado de Exited para el contenedor de ejemplo.

Listing all containers, including stopped containers.

Ahora que el contenedor está detenido, ejecutar el comando docker rm eliminará por completo el contenedor.

docker rm kind_galileo

En lugar de detener el contenedor y luego eliminarlo, la combinación de --force y docker rm detendrá y eliminará el contenedor en una sola operación. El contenedor, laughing_elion, ya no estará disponible para ejecutarse.

docker rm --force laughing_elion

Si no especificas el comando --force, encontrarás el mensaje de error Error response from daemon: You cannot remove a running container...

Stopping and removing a container.

Detener contenedores de Docker con Docker Compose

Los comandos de Docker suelen utilizarse en un solo contenedor, pero puedes crear un servicio con múltiples contenedores trabajando en conjunto. La herramienta Docker Compose te permite configurar un servicio compuesto por varios contenedores para que trabajen juntos.

Dado que los contenedores dentro de un servicio están diseñados para trabajar juntos, es mejor detener el servicio completo de manera adecuada en lugar de detener cualquier contenedor individualmente.

Si tienes un servicio en ejecución con varios contenedores, [docker-compose stop] detiene el servicio sin eliminar los contenedores ni el servicio. Sigue los pasos a continuación para crear un servicio de Docker Compose, iniciar el servicio y, en última instancia, detener el servicio de manera adecuada.

1. Crea un directorio para almacenar tu archivo de configuración. En este ejemplo, el directorio C:\Artículos\Ubuntu almacenará el archivo.

mkdir C:\Articles\Ubuntu

2. A continuación, crea el archivo docker-compose.yml, que contendrá la siguiente configuración. El siguiente archivo de Docker Compose crea un servicio con dos contenedores de Ubuntu, y cuando se inician, los contenedores no salen inmediatamente.

# La versión de especificación de docker-compose
version: "3.9"
# La colección de aplicaciones que componen este servicio
services:
  # Primer contenedor de Ubuntu
  container1:
    image: ubuntu
    # Igual que la opción -t y asigna un Pseudo-TTY, para que el contenedor no salga inmediatamente.
    tty: true
  # Segundo contenedor de Ubuntu
  container2:
    image: ubuntu
    tty: true

3. En una sesión de terminal, navega hasta el directorio de tu archivo de configuración personalizado de Docker, que en este ejemplo es C:\Artículos\Ubuntu. Ejecuta el comando docker-compose up -d para generar y arrancar el servicio creado en el paso anterior en segundo plano, como indica la opción -d.

Starting a Docker Compose service.

4. En la misma sesión de terminal y directorio, emite el comando docker-compose stop para detener el servicio y los contenedores de manera adecuada.

Stopping a Docker Compose service.

El comando docker-compose, al igual que el comando docker, también tiene los parámetros rm --force y kill. Los parámetros de docker-compose funcionan en el servicio en lugar de un solo contenedor. El comando docker-compose kill también admite una opción -s para especificar la señal de detención.

Conclusión

Los contenedores de Docker son una herramienta poderosa para crear entornos únicos y segmentados para el desarrollo y el uso en producción. En este artículo, has aprendido varias formas en que Docker detiene uno o más contenedores, e incluso todos. También has aprendido sobre la señal de detención predeterminada que Docker utiliza y cómo cambiarla.

Con este conocimiento, ahora sabes cómo detener los contenedores de Docker y cómo no equivocarte al detener los contenedores en ejecución. ¿Cómo planeas detener tus contenedores a partir de ahora, teniendo este nuevo conocimiento?

Source:
https://adamtheautomator.com/docker-stop-containers/