Cómo automatizar las actualizaciones de contenedores de Docker con Watchtower
Watchtower resuelve el problema común de cómo actualizar los contenedores de Docker en ejecución cuando se lanza una nueva imagen. Watchtower "observa" automáticamente sus contenedores, busca periódicamente nuevas versiones de sus imágenes y los reinicia para que ejecuten la nueva versión.
En este artículo, le mostraremos cómo usar Watchtower para simplificar la administración de su flota de contenedores. También veremos las opciones avanzadas que puede usar para personalizar el comportamiento de Watchtower.
Implementación de Atalaya
El primer paso es iniciar una instancia de Watchtower dentro de su propio contenedor Docker. Ejecute el siguiente comando para descargar la imagen de Watchtower y crear un contenedor:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
El socket Docker de su host está montado en el contenedor Watchtower con el -v
bandera. Esto permite que Watchtower interactúe con la instancia del demonio Docker de su host. Es necesario para que Watchtower pueda enumerar e iniciar contenedores.
Es posible usar Watchtower con un host Docker remoto. Exponga el demonio Docker de ese host en un puerto TCP, luego inicie Watchtower con un DOCKER_HOST
variable de entorno en lugar de un enlace de socket:
$ docker run -d --name watchtower -e DOCKER_HOST="tcp://192.168.0.1:2375" containrrr/watchtower
Si su host Docker está protegido con TLS, use Watchtower --tlsverify
marque y monte sus certificados en el contenedor /etc/ssl/docker
directorio:
$ docker run -d --name watchtower -e DOCKER_HOST="tcp://192.168.0.1:2375" -e DOCKER_CERT_PATH=/etc/ssl/docker -v ./certs:/etc/ssl/docker containrrr/watchtower --tlsverify
Watchtower está diseñado para ejecutarse una vez para el host de Docker. Cuando se inicia una nueva instancia de Watchtower, limpiará cualquier otro contenedor de Watchtower que ya exista. Puede ejecutar varias instancias asignándoles cada uno de los ámbitos únicos, pero esto no suele ser necesario en la mayoría de las implementaciones.
Usando la Atalaya
Su contenedor Watchtower inmediatamente comienza a monitorear los otros contenedores en su host Docker. Sondeará las actualizaciones de imágenes una vez cada 24 horas y reiniciará sus contenedores cuando ocurran cambios.
El nuevo contenedor conserva las mismas opciones que el original a partir del cual se crearon. Los enlaces de puertos, los montajes de volumen, las variables de entorno y cualquier otra configuración permanecerán intactos en el reemplazo.
Watchtower también es consciente de las dependencias: cuando los contenedores están vinculados entre sí, Watchtower los detendrá y los iniciará en un orden lógico. Los servicios que dependen de un contenedor en particular se detendrán antes de que ese contenedor se actualice y luego se restablecerán cuando el reemplazo esté disponible. Esto garantiza que sus aplicaciones no encuentren errores mientras se actualizan sus dependencias.
La Atalaya envía un SIGTERM
Señalar a los contenedores cuando necesita que se detengan para una actualización. Puede cambiar esta señal colocando una etiqueta en sus contenedores. Aquí se explica cómo cambiar a SIGHUP
en vez de SIGTERM
:
$ docker run -d --label=com.centurylinklabs.watchtower.stop-signal=SIGHUP my-image
Excluyendo e incluyendo contenedores
Puede personalizar qué contenedores se supervisan mediante una combinación de argumentos de comando de Watchtower y etiquetas de Docker en sus contenedores individuales. Aquí hay un ejemplo de cómo iniciar un contenedor que está excluido de las actualizaciones de Watchtower usando una etiqueta:
$ docker run -d --label=com.centurylinklabs.watchtower.enable=false my-image
También es posible incluir en la lista blanca los contenedores que deberían actualizarse, en lugar de excluir los que no deberían. Inicie Watchtower con el --label-enable
bandera para activar este comportamiento:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --label-enable
Ahora use la etiqueta para designar algunos contenedores como elegibles para recibir actualizaciones:
$ docker run -d --label=com.centurylinklabs.watchtower.enable=true my-image
Ganchos de ciclo de vida
Watchtower puede ejecutar scripts opcionalmente en el interior sus contenedores cuando ocurren eventos específicos. Hay cuatro ganchos disponibles:
pre-check
- Antes de que Watchtower verifique si hay una actualización disponible para el contenedor.pre-update
- Después de que se haya encontrado una actualización pero antes de que se reinicie el contenedor.post-update
- Después de que se haya completado una actualización.post-check
- Después de que se haya completado la verificación de actualizaciones de un contenedor.
Los ganchos se configuran mediante etiquetas de contenedores. El valor de la etiqueta debe ser la ruta a un ejecutable dentro de la imagen del contenedor. Esto se llamará cada vez que se dispare el gancho.
He aquí un ejemplo del uso de la pre-update
gancho:
$ docker run -d --label=com.centurylinklabs.watchtower.lifecycle.pre-update="/backup.sh --create" my-image
Los otros ganchos se configuran de manera similar sustituyendo su nombre en la etiqueta.
Notificaciones y Monitoreo
Watchtower puede enviarle notificaciones por correo electrónico, Slack, Microsoft Teams, Gotify y Shoutrrr cuando las actualizaciones de contenedores estén disponibles. Cada uno de estos mecanismos de entrega debe configurarse por separado estableciendo variables de entorno en su contenedor Watchtower.
Aquí hay un ejemplo básico que usa Gmail:
$ docker run -d --name watchtower -e WATCHTOWER_NOTIFICATIONS=email -e [email protected] -e [email protected] -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 -e [email protected] -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your_gmail_app_password -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Watchtower también admite un modo operativo en el que busca actualizaciones de contenedores sin aplicarlas. Puede usar esto para recibir una notificación cuando haya actualizaciones disponibles, luego reinicie sus contenedores usted mismo en un momento conveniente.
Active este modo con el --monitor-only
bandera:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --monitor-only
También hay una etiqueta que se puede configurar en contenedores individuales para habilitarlos en el modo de monitoreo:
$ docker run -d --label=com.centurylinklabs.watchtower.monitor-only=true my-image
Cambio del intervalo de sondeo de actualización
Watchtower busca nuevas imágenes cada 24 horas. Este intervalo se puede cambiar con el --interval
bandera o WATCHTOWER_POLL_INTERVAL
Variable ambiental. Acepta un valor en segundos.
# Update every hour $ docker run -d --name watchtower -e WATCHTOWER_POLL_INTERVAL=3600 -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Alternativamente, puede definir un programa de sondeo fijo utilizando la sintaxis cron. Esto se acepta como el --schedule
bandera o WATCHTOWER_SCHEDULE
Variable ambiental.
# Update every five minutes $ docker run -d --name watchtower -e WATCHTOWER_SCHEDULE="*/5 * * * *" -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Limpieza de imágenes antiguas
Watchtower deja la versión anterior de las imágenes del contenedor en su host después de extraer una nueva. Configuración de la --cleanup
bandera o WATCHTOWER_CLEANUP
La variable de entorno eliminará las imágenes antiguas después de una actualización. Esto puede liberar significativamente espacio en disco con el tiempo.
$ docker run -d --name watchtower -e WATCHTOWER_CLEANUP=true -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Ejecución bajo demanda
Watchtower está diseñado para ejecutarse como un demonio de larga duración que monitorea continuamente los contenedores en busca de actualizaciones. A veces, es posible que desee verificar manualmente si hay nuevas imágenes a pedido. Puedes hacer esto con el --run-once
bandera de comando:
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once
Esto realizará un solo intento de actualización para todos sus contenedores en ejecución. El contenedor Watchtower entonces se detendrá y será retirado.
Uso de registros privados
Watchtower necesita detalles de autenticación para buscar actualizaciones de imágenes en registros privados. Una forma de suministrarlos es montando su Docker config.json
archivo a /config.json
en su contenedor Watchtower:
$ docker run -d --name watchtower -v $HOME:/.docker/config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Hay una advertencia con este enfoque: las actualizaciones de config.json
en su host no necesariamente se reflejará dentro del contenedor. Comandos como docker login
en realidad reemplaza el archivo, en lugar de editarlo directamente. Esto crea un nuevo inodo, rompiendo el montaje de enlace de Docker.
Otra forma de proporcionar credenciales de registro a Watchtower es su REPO_USER
y REPO_PASS
variables Iniciará sesión como el usuario definido antes de intentar extraer sus imágenes.
$ docker run -d --name watchtower -e REPO_USER=demo-user -e REPO_PASS=users-password -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Conclusión
Watchtower le permite automatizar las actualizaciones de contenedores de Docker cuando se envían nuevas imágenes a un registro. Es un sistema altamente personalizable que admite listas negras y listas blancas de contenedores, programación avanzada con sintaxis cron y notificaciones enviadas a varios proveedores populares.
Los parámetros de configuración opcionales exponen funciones adicionales, como reinicios continuos, actualizaciones de contenedores que se reinician y detenidos, y soporte para exponer métricas que le brindan otra forma de visualizar la actividad de actualización. Esto hace que Watchtower sea una buena opción para administrar un conjunto ocupado de contenedores Docker de producción.
Descubre más contenido