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.

Índice de contenidos
  1. Implementación de Atalaya
  2. Usando la Atalaya
  3. Excluyendo e incluyendo contenedores
  4. Ganchos de ciclo de vida
  5. Notificaciones y Monitoreo
  6. Cambio del intervalo de sondeo de actualización
  7. Limpieza de imágenes antiguas
  8. Ejecución bajo demanda
  9. Uso de registros privados
  10. Conclusión

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

Subir Change privacy settings