GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Comandos de Docker para gestionar el ciclo de vida de los contenedores (guía definitiva)

Conocer los diversos estados del Docker Container es esencial para cualquier usuario serio de Docker.

Explicaré el ciclo de vida del contenedor y luego mostraré los comandos de Docker para cada etapa del ciclo de vida.

Pero antes de aprender todas esas cosas, revisemos el concepto del contenedor una vez más.

¿Qué son los contenedores Docker, de nuevo?

La mayoría de las definiciones tradicionales de contenedores son así:

Los contenedores son una forma de virtualización del sistema operativo. Si bien la virtualización tradicional basada en hipervisor requiere kernels separados para máquinas virtuales separadas, los contenedores comparten el mismo kernel de host y, por lo tanto, son mucho más livianos y rápidos de poner en marcha

La definición diferirá de una fuente a otra, pero la esencia es la misma.

Lo encuentro aburrido e innecesariamente complicado. Me gustaría usar algo diferente aquí para definir contenedores.

Los contenedores son un montón de procesos que están siendo engañados.

¿Por qué digo eso? Porque los contenedores son solo una colección de procesos, a veces solo un proceso. Y se miente a estos procesos sobre los diferentes recursos de su host, como redes, árbol de procesos, sistema de archivos, nombre de host, etc.

Puede ejecutar cualquier proceso, incluso un shell como bash , y oculte su árbol de procesos real, asígnele un conjunto diferente de redes, oculte el sistema de archivos raíz real, asígnele un nombre de host diferente y, esencialmente, lo que terminará haciendo es crear una versión en contenedor del proceso.

Esto se logra mediante espacios de nombres, sistema de archivos raíz separado y cgroups.

Docker es solo un envoltorio de las herramientas de nivel inferior que ejecutan y administran los contenedores, o más específicamente, dice el ciclo de vida del contenedor .

Aparte de eso, Docker también hace muchas otras cosas, como facilitar la creación de redes para los contenedores, manejar el almacenamiento, extraer y enviar imágenes de contenedores, etc.

Docker está aquí para hacernos la vida más fácil.

Ahora, veamos el ciclo de vida del contenedor Docker

El ciclo de vida del contenedor es básicamente una serie de etapas, desde la creación del contenedor hasta su destrucción.

El siguiente diagrama va a dejar esto muy claro.

Permítanme explicar cada etapa del ciclo de vida del contenedor.

  • Creación: Mucha gente piensa que cuando ejecuta un contenedor, es un solo paso. Pero ese no es el caso. Hay un proceso que crea los contenedores primero antes que nada. Más sobre esto más adelante.
  • Iniciado/En ejecución: Una vez que se crea un contenedor, se puede iniciar, después de lo cual el estado cambia a Running . Aquí es cuando el contenedor realmente está haciendo algo.
  • En pausa: Tradicionalmente para pausar un proceso (que son básicamente los contenedores), usamos la señal SIGSTOP, y para reanudar, la señal SIGCONT. Pero dado que esta señal es observable por los procesos, en lugar de señales, se utilizan congeladores cgroup. De esta forma se suspenden los procesos congelando el cgroup.
  • Salido/Detenido: Lo contrario de Running , pero no lo mismo que Paused . Detener un contenedor significa enviar la señal SIGTERM al proceso del contenedor principal, es decir, PID 1 en el espacio de nombres del contenedor. Luego espera 10 segundos para permitir que el proceso finalice correctamente. Si no es así, un SIGKILL se envía una señal, y todos sabemos lo que eso significa, ¿no?
  • Destruido/Eliminado: El contenedor ya no existe, todos los recursos que una vez asignó, ahora se han ido.

Espero que esto haya aclarado ahora el concepto del ciclo de vida del contenedor. En la siguiente sección, revisaré todos los comandos específicos de la ventana acoplable que lo ayudarán a administrar todos estos estados de contenedores.

Comandos de Docker para administrar el ciclo de vida del contenedor

Todos los comandos (subcomandos, si se es más específico) que controlan el ciclo de vida del contenedor pertenecen al subcomando container .

En una terminal si ejecuta docker container --help obtendrá una lista de subcomandos que están asociados con múltiples operaciones que se pueden realizar en los contenedores.

Pero no estamos preocupados por todos ellos aquí. Centrémonos solo en un subconjunto específico de ellos.

Creación de contenedores

La creación de contenedores se maneja con los siguientes comandos:

  1. docker container create
  2. docker create

La primera es la forma larga, mientras que la segunda, lo has adivinado bien, es la forma corta.

Te recomiendo que uses la forma larga ya que es más detallada y es algo que considero una buena práctica.

¿Qué es la creación de contenedores?

La creación del contenedor consiste en crear la capa R/W encima de la(s) capa(s) R/O de la imagen especificada y prepararla para ejecutar el programa requerido. La creación de un contenedor no inicia el proceso real, puede especificar todos los parámetros de configuración como capacidades, límite de CPU, límite de memoria, imagen del contenedor, etc. justo en la etapa de creación y luego iniciar el contenedor en cualquier momento que desee sin tener que volver a especificar esos parámetros. .

Leer docker container create --help para obtener una lista de opciones configurables.

Ejemplo

Primero cree un contenedor como el siguiente (utilicé un alpine imagen aquí para ejecutar el comando sleep infinity )

docker container create \
	--name alpine alpine:latest sleep infinity

Una vez que se crea el contenedor, debe obtener su ID en la pantalla de la terminal. Ahora puede filtrar la lista de contenedores para encontrar los contenedores que no se están ejecutando, pero que acaban de crearse .

docker container ls --filter=status=created

Aquí estoy filtrando la lista para obtener solo los contenedores que se crean. Eche un vistazo al STATUS columna, eso es lo que especifica el estado de un contenedor. Debería ver algo como lo siguiente:-

➟ docker container ls --filter=status=created
CONTAINER ID   IMAGE           COMMAND            CREATED          STATUS    PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   17 seconds ago   Created             alpine

También puede inspeccionar el contenedor y ver en qué estado se encuentra.

➟ docker container inspect -f '{{json .State.Status}}' alpine
"created"

Usando docker create no te dará nada diferente.

Inicio del contenedor

Para iniciar un contenedor, use uno de los siguientes dos comandos:-

  1. docker container start
  2. docker start

Lo mismo aquí, una versión larga y otra corta. Y te recomiendo que uses el ...container start comando.

¿Qué es el inicio de un contenedor?

Una vez que se ha creado un contenedor, puede iniciarlo. Iniciar el contenedor significa ejecutar realmente la aplicación en contenedor.

Si bien la creación de un contenedor simplemente prepara toda la configuración (cómo se ejecutará el contenedor, el entorno de tiempo de ejecución, las restricciones de tiempo de ejecución, el nombre del contenedor, etc.), no asigna ninguno de los recursos.

Al iniciar un contenedor, se asignan los recursos necesarios y se ejecuta la aplicación.

Ejemplo

Considere el contenedor anterior que creamos. Simplemente inicie el comando con el nombre o ID del contenedor de esta manera:

docker container start alpine

Una vez que se inicia el contenedor, su estado cambia de Created a Running . En la lista de contenedores, puede volver a filtrar por estado como lo hizo anteriormente:-

docker container ls --filter=status=running

En el STATUS columna, en lugar de Running mostrará cuánto tiempo ha estado funcionando el contenedor desde que comenzó.

➟ docker container ls --filter=status=running
CONTAINER ID   IMAGE           COMMAND            CREATED         STATUS          PORTS     NAMES
3f8d56fb3f78   alpine:3.13.4   "sleep infinity"   8 minutes ago   Up 18 seconds             alpine

También puede inspeccionar un contenedor para ver su estado. Usaré las plantillas de Go para dar formato a la salida según lo único que necesito, es decir, el estado.

docker container inspect \
	-f '{{json .State.Status}}' alpine

Deberías ver algo como esto -

➟ docker container inspect -f '{{json .State.Status}}' alpine
"running"

No es por sonar redundante, pero docker start hará exactamente lo mismo.

El comando especial de ejecución de Docker

Este es un comando especial que une la creación y el inicio del contenedor y es el comando que todos usamos más.

  1. docker container run
  2. docker run

Estos comandos esencialmente (i) crean el contenedor e inmediatamente (ii) inician el mismo contenedor.

Esto es útil porque crear y dejar que un contenedor comience más tarde no es algo que hacemos con demasiada frecuencia. Cuando esté en la línea de comando, con la CLI de la ventana acoplable, estará aquí para ejecutar un contenedor. Y eso es exactamente lo que ...container run el comando lo hace.

Ejemplo

El ejemplo de este comando es muy simple. Para ejecutar un contenedor, en lugar de docker container create , use docker container run .

Usted lo hará tiene que pasar todas las opciones que pasaría a docker container create a esta docker container run dominio. Esto se debe a que Docker necesita toda esa información en ese momento, ya que no hay más segundos pasos.

➟ docker container run --name echo-me alpine:3.13.4 echo "Subscribe to Linux Handbook"
Subscribe to Linux Handbook
Docker Run vs Start vs Create:diferencia explicada Para un principiante de docker, términos como docker start, docker run y docker create pueden ser confusos. Este artículo explica la diferencia con ejemplos. Manual de LinuxAbhishek Prakash

Contenedor en pausa

Pausar un contenedor significa exactamente cómo suena. No detenemos ningún proceso, solo lo pausamos. Entonces, si un proceso dentro de un contenedor está contando del 1 al 100, y se detuvo mientras estaba en el conteo 50 y luego se detuvo en un momento posterior, el conteo reanudará desde 50.

Una cosa a entender es que mientras Paused es un estado actual, Unpaused no es. Cuando está reactivando un contenedor en pausa, básicamente está cambiando el estado de Paused a Running .

Los comandos que se utilizan para pausar un contenedor son los siguientes:-

  1. docker container pause
  2. docker pause

De manera similar, puede reanudar un contenedor con las contrapartes de reanudar:-

  1. docker container unpause
  2. docker unpause

¿Cómo se pausa un contenedor?

Un proceso se pausa usando la señal SIGSTOP, y para reanudar la pausa se usa la señal SIGCONT. Dado que estas señales pueden ser observadas por los procesos, en lugar de señales, se utilizan congeladores cgroup. De esta forma se suspenden los procesos congelando el cgroup. Al congelar un cgroup, se congelan todas sus tareas y todos sus cgroups secundarios.

Ejemplo:

Por el bien de esta demostración, he creado un contenedor especial. Tire de la imagen ejecutando el siguiente comando:-

docker image pull debdutdeb/pause-demo:v1

Puede consultar el Dockerfile y el código aquí mismo.

Una vez extraído, en una terminal, inicie un contenedor con esta imagen

docker container run --name pause-demo debdutdeb/pause-demo:v1

Ahora debería mostrar el conteo a partir de 0 y continuar. Debería verse algo como lo siguiente

➟ docker container run --name pause-demo debdutdeb/pause-demo:v1 
Count at 30

En otra terminal, pausa este contenedor.

docker container pause pause-demo

En el momento en que pausa el contenedor, debería ver que la cuenta regresiva se detiene, pero la terminal aún no le ha respondido. Esto se debe a que el contenedor aún no se ha detenido (hablaré de esto más adelante en este artículo). Una vez que detenga este contenedor, la cuenta regresiva debería reanudarse, no reiniciarse.

docker container unpause pause-demo

Para recuperar la terminal, en una ejecución de terminal separada

docker container stop pause-demo

Aquí hay un video corto que lo mostrará en acción:-

Antes de detener el contenedor, puede indicar que le gustan los anteriores, verifique el estado del contenedor en pausa de esta manera:

➟ docker container inspect -f '{{json .State.Status}}' pause-demo 
"paused"

Detención de contenedores

Puede detener un contenedor Docker usando uno de los siguientes dos comandos:-

  1. docker container stop
  2. docker stop

Detener un contenedor significa detener todos los procesos asociados con él.

Esto no es lo mismo que pausar un contenedor. Si detiene un contenedor, puede reiniciarlo, pero los procesos no se reanudarán desde el estado en el que se encontraban anteriormente. Un proceso puede guardar su información de estado en un "archivo" y restaurar su estado desde ese archivo, pero ese es un caso diferente.

Por ejemplo, después de detener la pause-demo anterior contenedor, si intenta reiniciarlo usando ...container start comando, comenzará a contar desde el principio, a diferencia de su pause contraparte que reanuda el conteo.

¿Cómo funciona el proceso?

Cuando le pide a Docker que detenga un contenedor, envía un SIGTERM señal al PID 1 del contenedor. Después de eso, espera 10 segundos, que es su período de tiempo correcto, se le da este tiempo al proceso para salir correctamente, en otras palabras, limpiar y terminar lo que sea que estaba funcionando. Una vez transcurridos los 10 segundos, Docker envía un SIGKILL final. señal, no tengo que decirte lo que sucede a continuación.

Docker envía la señal al PID 1 del contenedor porque todos los demás procesos son secundarios del PID 1, si este proceso finaliza o elimina, los procesos secundarios dejarán de existir automáticamente.

Esto se vuelve más claro con el siguiente ejemplo.

Ejemplo:

Tienes que sacar una imagen, otra vez.

docker image pull debdutdeb/stop-demo:v1

Para el Dockerfile y el código fuente, consulte esta esencia.

En una terminal, inicie un contenedor desde esta imagen.

docker container run --name stop-demo debdutdeb/stop-demo:v1

Una vez ejecutado, debería ver una pantalla que le indica su PID y que está esperando.

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...

Abra otra terminal y ejecute el comando de parada en este contenedor.

docker container stop stop-demo

Una vez ejecutado, debería ver en la terminal que estaba ejecutando el contenedor, indicándole qué IT está experimentando, es decir, recibiendo el SIGTERM señal.

Luego comienza a contar los segundos, y verás que después de 10 segundos simplemente deja de contar. Esto no se debe a que lo codifiqué de esa manera, en realidad lo codifiqué para que continuara infinitamente.

Pero después de 10 segundos, Docker envía un SIGKILL señal que no podemos atrapar o ignorar, el proceso está destinado a ser asesinado.

Puede cambiar el tiempo que espera Docker antes de enviar el SIGKILL señal usando el -t opción con docker container stop .

Una vez que todo esté hecho, debería ver algo como esto

➟ docker container run --name stop-demo debdutdeb/stop-demo:v1 
My PID in this container is 1
Waiting...
SIGTERM ignored,
Starting count..
10 seconds

Aquí hay un pequeño video que demuestra esto:-

Puede verificar el estado de este contenedor ahora usando ...container inspect así:-

➟ docker container inspect -f '{{json .State.Status}}' stop-demo
"exited"

Eliminación de contenedor

Un contenedor se elimina usando uno de los siguientes dos comandos:-

  1. docker container rm
  2. docker rm

La eliminación de contenedores es lo opuesto a la creación de contenedores. Cuando elimina un contenedor, desaparece, no puede traer ese específico contenedor de vuelta. Puede iniciar uno nuevo desde la misma imagen usando la misma configuración, hacerlo idéntico, pero no será exactamente igual al anterior.

Ejemplo:

Para ver un ejemplo, simplemente elimine el stop-demo anterior contenedor.

docker container rm stop-demo

Hasta ahora, todos los contenedores que creó y luego detuvo se pueden eliminar con un solo comando:-

docker container prune

Esto eliminará todos los contenedores con el estado Exited .

Salida de ejemplo:

✗ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ffbdd621c01d0eb3f42d348eeb75c731ddd9bd85674bb90dece32bd70357e541
21b9ed6a6198cd6ee7e162aebd936ae3e93b3b0f738161924a825a27794f2b20
f5f5149866a6ced675ad3bfff0b7386f75ee3fdbddca86be8b8ba341dba4b27f

Total reclaimed space: 0B

Entonces, aprendiste el concepto del ciclo de vida del contenedor. Y también aprendiste los comandos de Docker para administrar cada etapa del ciclo de vida de los contenedores. Si desea obtener más sugerencias de Docker, puede conocer estos comandos de Docker menos conocidos pero útiles.

3 Comandos de Docker que los usuarios avanzados de Docker deben conocer Aquí hay algunos comandos de Docker que quizás no conozca, pero que podrían ser útiles al administrar sus contenedores. Manual de LinuxDebdut Chakraborty

Realmente espero que este artículo haya hecho que la teoría del ciclo de vida del contenedor sea fácil de entender y también haya aclarado todos los comandos que necesita para administrar estos diferentes estados.

Si tiene alguna pregunta, deje un comentario a continuación.


Docker
  1. Qué es un contenedor Docker:una guía introductoria para principiantes

  2. Cómo ejecutar Nginx en un contenedor Docker:una guía paso a paso

  3. Cómo ejecutar MySQL en Docker Container:una guía simple y fácil de seguir

  4. Una introducción a Docker

  5. Hoja de referencia rápida de comandos de Docker

Guía definitiva sobre copia de seguridad y restauración de contenedores Docker [Un enfoque en la nube + local para servidores independientes]

Guía completa para eliminar imágenes de Docker

21 comandos esenciales que todo usuario de Docker debe conocer

Guía para principiantes sobre la política de reinicio de Docker

ctop:interfaz superior para monitorear contenedores Docker

40 comandos importantes de Docker para desarrolladores de software