Comment automatiser les mises à jour du conteneur Docker avec Watchtower
Agence web » Actualités du digital » Comment automatiser les mises à jour du conteneur Docker avec Watchtower

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.

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.

★★★★★