Comment automatiser les mises à jour du conteneur Docker avec Watchtower
Watchtower résout le problème courant de mise à jour des conteneurs Docker en cours d’exécution lorsqu’une nouvelle image est publiée. Watchtower « surveille » automatiquement vos conteneurs, interroge périodiquement les nouvelles versions de leurs images et les redémarre pour qu’ils exécutent la nouvelle version.
Dans cet article, nous montrerons comment utiliser Watchtower pour simplifier l’administration de votre flotte de conteneurs. Nous examinerons également les options avancées que vous pouvez utiliser pour personnaliser le comportement de Watchtower.
Sommaire
Déploiement de la tour de guet
La première étape consiste à démarrer une instance Watchtower dans son propre conteneur Docker. Exécutez la commande suivante pour télécharger l’image Watchtower et créer un conteneur :
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Le socket Docker de votre hôte est monté dans le conteneur Watchtower avec le -v
drapeau. Cela permet à Watchtower d’interagir avec l’instance du démon Docker de votre hôte. Il est nécessaire pour que la Watchtower puisse énumérer et démarrer les conteneurs.
Il est possible d’utiliser Watchtower avec un hôte Docker distant. Exposez le démon Docker de cet hôte sur un port TCP, puis démarrez Watchtower avec un DOCKER_HOST
variable d’environnement au lieu d’une liaison de socket :
$ docker run -d --name watchtower -e DOCKER_HOST="tcp://192.168.0.1:2375" containrrr/watchtower
Si votre hôte Docker est protégé par TLS, utilisez Watchtower’s --tlsverify
marquez et montez vos certificats dans le conteneur /etc/ssl/docker
annuaire:
$ 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 conçu pour s’exécuter une fois par hôte Docker. Lorsqu’une nouvelle instance Watchtower démarre, elle nettoie tous les autres conteneurs Watchtower déjà existants. Vous pouvez exécuter plusieurs instances en leur attribuant chacune des étendues uniques, mais cela n’est généralement pas nécessaire dans la plupart des déploiements.
Utiliser la tour de guet
Votre conteneur Watchtower commence immédiatement à surveiller les autres conteneurs sur votre hôte Docker. Il interrogera les mises à jour d’image une fois toutes les 24 heures et redémarrera vos conteneurs lorsque des modifications se produiront.
Le nouveau conteneur conserve les mêmes options que l’original à partir duquel il a été créé. Les liaisons de port, les montages de volume, les variables d’environnement et tout autre paramètre seront tous intacts lors du remplacement.
Watchtower est également sensible aux dépendances : lorsque les conteneurs sont liés, Watchtower les arrête et les démarre dans un ordre logique. Les services qui dépendent d’un conteneur particulier seront arrêtés avant la mise à jour de ce conteneur, puis rétablis une fois le remplacement disponible. Cela garantit que vos applications ne rencontrent pas d’erreurs pendant la mise à jour de leurs dépendances.
La tour de guet envoie un SIGTERM
signaler aux conteneurs lorsqu’il a besoin qu’ils s’arrêtent pour une mise à jour. Vous pouvez modifier ce signal en apposant une étiquette sur vos conteneurs. Voici comment passer à SIGHUP
à la place de SIGTERM
:
$ docker run -d --label=com.centurylinklabs.watchtower.stop-signal=SIGHUP my-image
Exclure et inclure les conteneurs
Vous pouvez personnaliser les conteneurs surveillés à l’aide d’une combinaison d’arguments de commande Watchtower et d’étiquettes Docker sur vos conteneurs individuels. Voici un exemple de démarrage d’un conteneur dont les mises à jour Watchtower ont été désactivées à l’aide d’un libellé :
$ docker run -d --label=com.centurylinklabs.watchtower.enable=false my-image
Il est également possible de mettre en liste blanche les conteneurs qui doivent être mis à jour, au lieu de désactiver ceux qui ne le devraient pas. Démarrer Watchtower avec le --label-enable
drapeau pour activer ce comportement :
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --label-enable
Utilisez maintenant le libellé pour désigner certains conteneurs comme éligibles pour recevoir des mises à jour :
$ docker run -d --label=com.centurylinklabs.watchtower.enable=true my-image
Crochets de cycle de vie
Watchtower peut éventuellement exécuter des scripts à l’intérieur vos conteneurs lorsque des événements spécifiques se produisent. Quatre crochets sont disponibles :
pre-check
– Avant que la Watchtower vérifie si une mise à jour est disponible pour le conteneur.pre-update
– Après qu’une mise à jour a été trouvée mais avant le redémarrage du conteneur.post-update
– Une fois la mise à jour terminée.post-check
– Une fois la vérification des mises à jour d’un conteneur terminée.
Les crochets sont configurés à l’aide d’étiquettes de conteneur. La valeur de l’étiquette doit être le chemin d’accès à un exécutable à l’intérieur de l’image du conteneur. Celui-ci sera appelé chaque fois que le crochet se déclenchera.
Voici un exemple d’utilisation de pre-update
accrocher:
$ docker run -d --label=com.centurylinklabs.watchtower.lifecycle.pre-update="/backup.sh --create" my-image
Les autres crochets sont configurés de manière similaire en substituant leur nom dans l’étiquette.
Notifications et surveillance
Watchtower peut vous envoyer des notifications par e-mail, Slack, Microsoft Teams, Gotify et Shoutrrr lorsque des mises à jour de conteneurs sont disponibles. Chacun de ces mécanismes de livraison doit être configuré séparément en définissant des variables d’environnement dans votre conteneur Watchtower.
Voici un exemple basique qui utilise Gmail :
$ docker run -d --name watchtower -e WATCHTOWER_NOTIFICATIONS=email -e WATCHTOWER_NOTIFICATION_EMAIL_FROM=you@gmail.com -e WATCHTOWER_NOTIFICATION_EMAIL_TO=you@gmail.com -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.gmail.com -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587 -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=you@gmail.com -e WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=your_gmail_app_password -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Watchtower prend également en charge un mode de fonctionnement dans lequel il vérifie les mises à jour du conteneur sans les appliquer. Vous pouvez l’utiliser pour être averti lorsque des mises à jour sont disponibles, puis redémarrez vous-même vos conteneurs à un moment opportun.
Activez ce mode avec le --monitor-only
drapeau:
$ docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --monitor-only
Il existe également une étiquette qui peut être définie sur des conteneurs individuels pour les activer en mode de surveillance :
$ docker run -d --label=com.centurylinklabs.watchtower.monitor-only=true my-image
Modification de l’intervalle d’interrogation de mise à jour
La tour de guet recherche de nouvelles images toutes les 24 heures. Cet intervalle peut être modifié avec le --interval
drapeau ou WATCHTOWER_POLL_INTERVAL
variables d’environnement. Il accepte une valeur en secondes.
# Update every hour $ docker run -d --name watchtower -e WATCHTOWER_POLL_INTERVAL=3600 -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Vous pouvez également définir un calendrier d’interrogation fixe à l’aide de la syntaxe cron. Ceci est accepté comme le --schedule
drapeau ou WATCHTOWER_SCHEDULE
variables d’environnement.
# Update every five minutes $ docker run -d --name watchtower -e WATCHTOWER_SCHEDULE="*/5 * * * *" -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Nettoyer les anciennes images
La tour de guet laisse l’ancienne version des images de conteneur sur votre hôte après l’extraction d’une nouvelle. Réglage de la --cleanup
drapeau ou WATCHTOWER_CLEANUP
La variable d’environnement supprimera les anciennes images après une mise à jour. Cela peut libérer considérablement de l’espace disque au fil du temps.
$ docker run -d --name watchtower -e WATCHTOWER_CLEANUP=true -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Exécution à la demande
Watchtower est conçu pour fonctionner comme un démon de longue durée qui surveille en permanence les mises à jour des conteneurs. Parfois, vous souhaiterez peut-être rechercher manuellement de nouvelles images à la demande. Vous pouvez le faire avec le --run-once
indicateur de commande :
$ docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once
Cela effectuera une seule tentative de mise à jour pour tous vos conteneurs en cours d’exécution. Le conteneur Watchtower s’arrêtera alors et sera retiré.
Utiliser des registres privés
La Watchtower a besoin de détails d’authentification pour vérifier les mises à jour des images dans les registres privés. Une façon de les fournir est de monter votre Docker config.json
fichier à /config.json
dans votre conteneur Watchtower :
$ docker run -d --name watchtower -v $HOME:/.docker/config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Il y a une mise en garde avec cette approche : les mises à jour de config.json
sur votre hôte ne sera pas nécessairement reflété à l’intérieur du conteneur. Des commandes comme docker login
remplacer réellement le fichier, au lieu de le modifier directement. Cela crée un nouvel inode, rompant le montage de liaison Docker.
Une autre façon de fournir des informations d’identification de registre à Watchtower est son REPO_USER
et REPO_PASS
variables. Il se connectera en tant qu’utilisateur défini avant d’essayer d’extraire vos images.
$ 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
Conclusion
Watchtower vous permet d’automatiser les mises à jour du conteneur Docker lorsque de nouvelles images sont transmises à un registre. Il s’agit d’un système hautement personnalisable qui prend en charge les listes noires et blanches de conteneurs, la planification avancée avec la syntaxe cron et les notifications envoyées à plusieurs fournisseurs populaires.
Les paramètres de configuration facultatifs exposent d’autres fonctionnalités, telles que les redémarrages progressifs, les mises à jour des conteneurs redémarrés et arrêtés, et la prise en charge de l’exposition de métriques qui vous offrent une autre façon de visualiser l’activité de mise à jour. Cela fait de Watchtower un bon choix pour gérer un ensemble chargé de conteneurs Docker de production.