Docker proporciona una opción de política de reinicio para permitir que sus contenedores se reinicien automáticamente en caso de ciertos eventos o fallas.
Esto es extremadamente útil en escenarios en los que debe reiniciar el host Docker (su servidor Linux) o si falla el servicio que se ejecuta en el contenedor.
Las políticas de reinicio de Docker se aplican por contenedor. Hay dos formas de asignar una política de reinicio a un contenedor. Puede configurarlo en el archivo YAML si va a utilizar Docker Compose o Swarm o Kubernetes.
También puede configurar la política de reinicio directamente en la línea de comando cuando ejecuta un contenedor:
docker container run --restart <policy>
Hablemos sobre qué tipo de política de reinicio puede usar.
Políticas de reinicio de Docker
Existen las siguientes políticas de reinicio para contenedores Docker:
- no:el comportamiento predeterminado es no iniciar contenedores automáticamente
- siempre:siempre reinicie un contenedor detenido a menos que el contenedor se haya detenido explícitamente
- a menos que se detenga:reinicie el contenedor a menos que el contenedor estuviera detenido antes de que se detuviera el demonio Docker (se explica más adelante)
- en caso de error:reinicie el contenedor si salió con un código de salida distinto de cero o si el demonio docker se reinicia
Como mencioné, si no agrega explícitamente una política de reinicio, dice "no", lo que significa que los contenedores no se reiniciarán automáticamente.
Explicación de las políticas de reinicio de Docker con ejemplos
Permítame mostrarle estas políticas en acción para que pueda visualizarlas. Esto es especialmente útil para entender la diferencia entre always
y unless-stopped
políticas.
Política de reinicio siempre
Comencemos con el always
política de reinicio. Con esta política establecida, el contenedor siempre se reiniciará a menos que se haya detenido explícitamente.
Voy a ejecutar un contenedor Alpine Linux con always
política de reinicio. Lo estoy nombrando siempre-política.
El contenedor tiene una tarea. Ejecuta el comando bash sleep durante 10 segundos y luego sale.
docker container run --name always-policy --restart always alpine sleep 10
Sin el always
reiniciar la política, el contenedor se habría detenido después de 10 segundos. Pero aquí, se reiniciará automáticamente y ejecutará el comando de suspensión durante otros 10 segundos y continuará así.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 25 seconds ago Up 4 seconds always-policy
Puede ver en el comando anterior que, aunque el contenedor se creó hace 25 segundos, solo ha estado activo durante 4 segundos. Tenga en cuenta que se reinicia el mismo contenedor, no se crea uno nuevo.
Puede usar el comando docker inspect para ver cuántas veces se ha reiniciado el contenedor hasta el momento.
[email protected]:~$ docker inspect always-policy | grep -i restartcount
"RestartCount": 4,
Si detiene el contenedor con el comando de parada, no se reiniciará automáticamente después. Puede ver en el siguiente ejemplo que el contenedor ahora tiene el estado 'Salido' en lugar de Activo.
[email protected]:~$ docker stop always-policy
always-policy
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 58 seconds ago Exited (0) 6 seconds ago always-policy
He usado el -it
opción para ejecutar el contenedor con terminal interactivo en la captura de pantalla anterior. Eso fue por costumbre e innecesario aquí.
a menos que se detenga frente a la política de reinicio siempre
El unless-stopped
es similar al always
política de reinicio. Ambos reinician los contenedores automáticamente y si detiene los contenedores explícitamente, no se reinician.
Pero la principal diferencia entre los dos es que si detiene los contenedores con el comando docker stop y luego reinicia el demonio docker, el contenedor con always
la política de reinicio iniciará el contenedor automáticamente, pero el contenedor con unless-stopped
la política no se reiniciará.
Déjame mostrarlo con ejemplos. Ya tengo un contenedor detenido con política de reinicio siempre. Permítanme crear un nuevo contenedor llamado a menos que se detenga la política con unless-stopped
política.
docker container run --name unless-stopped-policy --restart always alpine sleep 10
Detener el contenedor:
docker stop unless-stopped-policy
Ahora tengo dos contenedores que se han detenido explícitamente:
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d244b6e08899 alpine "sleep 10" 2 minutes ago Exited (0) About a minute ago unless-stopped-policy
1171dcfb7e06 alpine "sleep 10" 22 minutes ago Exited (0) 21 minutes ago always-policy
Reinicie el demonio de Docker:
sudo systemctl restart docker
Ahora, si revisa los contenedores en ejecución, puede ver que el contenedor llamado política siempre se está ejecutando porque se configuró con always
política de reinicio.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 30 minutes ago Up 8 seconds always-policy
Los pasos completos se pueden ver en esta captura de pantalla:
política de reinicio en caso de error
El on-failure
La política de reinicio reinicia un contenedor si se salió con un código de salida distinto de cero (que indica error/falla). También reinicia los contenedores si el demonio docker se reinicia, incluidos los que estaban detenidos antes.
Si detiene manualmente un contenedor con el comando docker stop, existe con el código cero que indica que todo era normal.
Configuración de la política de reinicio en el archivo Docker Compose
A estas alturas, ya tiene una buena idea sobre cómo ejecutar un contenedor con una política de reinicio.
Si está utilizando algo como Docker Compose para implementar contenedores, puede mencionar la política de reinicio para el objeto de servicio en el archivo YAML.
Aquí hay un ejemplo de muestra:
version: "3.3"
services:
NginxProxy:
image: "jwilder/nginx-proxy:latest"
restart: "on-failure"
networks: ["net"]
ports:
- "80:80"
- "443:443"
¿Qué política de reinicio de Docker usar?
Honestamente, no hay una respuesta directa a esta pregunta. Depende de su caso de uso y de lo que desee.
Espero que este artículo haya sido útil para comprender la política de reinicio de Docker. Si tiene alguna pregunta o sugerencia, hágamelo saber en la sección de comentarios.