¿Tiene problemas con los contenedores de parada de Docker? Encontrar la forma correcta de detener un contenedor es difícil con la capacidad de crear muchos contenedores diferentes. En este artículo, aprenderá los comandos de Docker para detener un contenedor o todos los contenedores.
¡Sigue leyendo para obtener más información!
Requisitos
Para seguir este tutorial, asegúrese de tener lo siguiente:
- Windows 10:el tutorial usa Windows para ejecutar Docker, pero también puede aplicar los mismos pasos generales a Linux o macOS.
- Escritorio Docker – Este tutorial utiliza la versión 3.5.2. El motor Docker está disponible si está en Linux, ya que la GUI no lo está.
- Un contenedor o contenedores de Docker en ejecución.
Contenedores finales con el comando docker stop Containers
Comencemos con el primer comando:docker stop
el comando de contenedores y cómo logra detener los contenedores.
Por ejemplo, tal vez necesite detener un contenedor en ejecución con el nombre mystifying_hofstadter
y una ID de fb66ed502096
. Como se muestra en el siguiente ejemplo, detenga el contenedor con docker stop
comando contenedores.
# Stop the container via the name
docker stop mystifying_hofstadter
# Stop the container via the ID (same container)
docker stop fb66ed50209
¿Qué sucede si tiene varios contenedores en ejecución y desea detenerlos? La docker stop
El comando de contenedores admite la detención de varios ID de contenedores, uno a la vez.
Primero, enumere todos los contenedores a través de docker ps
comando y pase los ID de contenedor a docker stop
comando contenedores, como se muestra a continuación.
# List all running containers
docker ps
# Stop the following Docker containers via the container ID
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
¿Qué sucede si desea detener todos los contenedores en ejecución sin recuperar los ID de contenedor manualmente y pasarlos a docker stop
? ? El docker ps -q
el comando logrará eso. El -q
parámetro de docker ps
El comando genera solo los ID de los contenedores.
# Create three containers. A semi-colon separates each command
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# List all running containers
docker ps -q
# Retrieve all running container IDs and pass those to docker stop
docker stop $(docker ps -q)
El
$(docker ps -q)
La construcción anterior es una subexpresión tanto en Bash en Linux como en PowerShell en Windows. Una subexpresión le indica al shell que procese un conjunto de comandos,docker ps -q
, primero y luego devolver el conjunto de resultados al comando originaldocker stop
.
La docker stop
El comando container usa la señal SIGTERM. Las señales de Linux informan a un proceso de un evento, pero depende del proceso decidir cómo actuar ante una señal determinada.
Cuando se usa la señal SIGTERM, Docker usa la señal para detener correctamente un proceso esperando un 10
predeterminado segundos antes de enviar la señal SIGKILL, que termina el proceso inmediatamente.
Detención de un contenedor mediante señales de proceso
Aprendió sobre el comportamiento predeterminado de Docker (señal de parada), con docker stop
comandos de contenedores, al detener un contenedor. Pero es posible que no desee el comportamiento predeterminado. En su lugar, puede indicarle a Docker que use señales de parada alternativas.
Con docker run
comandos --stop-signal
bandera, puede especificar la señal de parada al iniciar el contenedor. Esta bandera establece la señal que se enviará al contenedor en ejecución cuando desee que se detenga.
En el siguiente ejemplo, --stop-signal
flag toma el valor SIGQUIT
, que le dice a Docker que envíe la señal SIGQUIT cuando sea el momento de detener el contenedor. El ejemplo también usa los siguientes parámetros:
d
– Ejecuta el contenedor en modo separado (en segundo plano). El modo separado no permitirá que el usuario interactúe inmediatamente con el contenedor, ya que el proceso se ejecuta en segundo plano.t
– asigna una consola Pseudo-TTY (PTY), que emula una consola de terminal real en el contenedor y evita que el contenedor de Ubuntu salga inmediatamente. El contenedor de Ubuntu del ejemplo requiere que una consola PTY permanezca activa en segundo plano.- “nombre de la imagen”:de qué imagen de Docker aprovisionar el contenedor, en este caso,
ubuntu
imagen.
docker run -d -t --stop-signal SIGQUIT ubuntu
También puede especificar la señal de parada mediante un Dockerfile, que le indica a Docker cómo crear un contenedor. Puede agregar una entrada al Dockerfile especificando la señal de parada con
STOPSIGNAL SIGQUIT
, por ejemplo. Puede cambiar elSIGQUIT
con cualquier señal de alto que desee.
Salir de los contenedores inmediatamente con docker kill
Habrá momentos en los que querrá salir de los contenedores sin permitirles un período de gracia. El docker kill
comando detiene inmediatamente un contenedor.
El siguiente ejemplo pasa el contenedor con ID 2aa318273db5
para docker kill
. El contenedor saldrá inmediatamente a través de la señal SIGKILL. El contenedor no podrá salir airoso. Como resultado del comando, el contenedor se cerrará y se mostrará la ID del contenedor.
docker kill 2aa318273db5
Docker elimina todos los contenedores con el comando
docker kill $(docker ps -q)
. Observe que(docker ps -q
) es una subexpresión aquí.
Detener y eliminar un contenedor con docker rm
De forma predeterminada, cuando crea un contenedor, ese contenedor se crea igual que antes:es idempotente. La eliminación de un contenedor tendrá un impacto mínimo y, con eso en mente, docker rm
puede forzar la detención y retirar un contenedor. Docker emite un SIGKILL
envía una señal al proceso principal y elimina el contenedor de la lista de contenedores disponibles en su instalación de Docker.
Si el contenedor debe conservar los archivos internos modificados o debe conservarse su estado, la eliminación de un contenedor destruirá esos cambios. ¡Cuidado con los posibles errores!
En el siguiente ejemplo, quizás haya iniciado un contenedor al que se le asignó el nombre kind_galileo
. Antes de retirar un contenedor, se debe detener el contenedor, como se muestra a continuación. El docker ps -a
el comando muestra el estado de Exited
para el contenedor de ejemplo.
Ahora que el contenedor dejó de emitir docker rm
El comando eliminará el contenedor por completo.
docker rm kind_galileo
En lugar de detener el contenedor para luego eliminarlo, la combinación de --force
y docker rm
detendrá y retirará el contenedor en una sola operación. El contenedor, laughing_elion
, ya no estará disponible para ejecutarse.
docker rm --force laughing_elion
Si no especifica el
--force
comando, encontrará el mensaje de errorError response from daemon: You cannot remove a running container...
Detención de contenedores Docker con Docker Compose
Los comandos de Docker generalmente se usan en un solo contenedor, pero puede crear un servicio con varios contenedores que funcionan en conjunto. La herramienta Docker Compose le permite configurar un servicio compuesto por varios contenedores para trabajar juntos.
Como los contenedores dentro de un servicio están diseñados para funcionar juntos, es mejor detener todo el servicio correctamente en lugar de cualquier contenedor individual.
Si tiene un servicio que se ejecuta con varios contenedores, [docker-compose stop]
detiene el servicio sin retirar los contenedores ni el servicio. Siga a continuación para crear un servicio Docker Compose, iniciar el servicio y, en última instancia, detener el servicio correctamente.
1. Cree un directorio para almacenar su archivo de configuración. En este ejemplo, el directorio C:\Artículos\Ubuntu almacenará el archivo.
mkdir C:\Articles\Ubuntu
2. A continuación, cree el archivo docker-compose.yml archivo, que contiene la siguiente configuración. El siguiente archivo Docker Compose crea un servicio con dos contenedores de Ubuntu y, cuando se activan, los contenedores no se cierran inmediatamente.
# The specification version of docker-compose
version: "3.9"
# The collection of applications composing this service
services:
# First Ubuntu Container
container1:
image: ubuntu
# Same as the -t option and allocates a Psuedo-TTY, so the container does not immediately exit.
tty: true
# Second Ubuntu Container
container2:
image: ubuntu
tty: true
3. En una sesión de terminal, vaya a su directorio de archivos de configuración de Docker personalizado, que en este ejemplo es C:\Articles\Ubuntu . Ejecute docker-compose up -d
para generar e iniciar el servicio creado en el paso anterior en segundo plano como lo indica el -d
opción.
4. En la misma sesión de terminal y directorio, emita el comando docker-compose stop
para finalizar el servicio y los contenedores con gracia.
El
docker-compose
comando, comodocker
comando, también tiene elrm --force
ykill
parámetrosdocker-compose
los parámetros funcionan en el servicio en lugar de un solo contenedor. Eldocker-compose kill
el comando también toma una opción-s
opción para especificar la señal de parada.
Conclusión
Los contenedores Docker son una herramienta poderosa para crear entornos únicos y segmentados para uso en desarrollo y producción. En este artículo, ha aprendido varias formas en que Docker detiene uno o más contenedores, incluso todos. También aprendiste sobre la señal de parada predeterminada que usa Docker y cómo cambiarla.
Con este conocimiento, ahora conoce los entresijos de detener contenedores Docker y cómo no equivocarse cuando es hora de dejar de ejecutar contenedores. ¿Cómo planea detener sus contenedores a partir de ahora, teniendo este nuevo conocimiento?