Comment mettre à jour automatiquement les conteneurs Docker à partir de votre registre d’images
Docker est un outil qui facilite l’exécution d’applications dans des conteneurs portables. L’un des principaux avantages de la conteneurisation est la gestion facile des mises à jour : tout ce que vous avez à faire est de redémarrer avec un nouveau conteneur, et il existe des outils qui peuvent automatiser l’ensemble de ce processus.
Sommaire
Déploiement automatique des conteneurs Docker
Docker est un excellent choix pour les pipelines d’intégration continue/déploiement continu (CI/CD) car il permet d’automatiser les deux étapes du processus. Les Dockerfiles eux-mêmes fournissent un moyen de créer l’image de votre application, et il est assez facile de configurer des constructions de conteneurs automatisées à partir de la source sur des services comme Github. Une fois construit et poussé vers un « registre d’images », il peut ensuite être téléchargé et exécuté par n’importe quel serveur exécutant Docker.
C’est très bien, mais cela implique toujours d’exécuter des commandes sur le serveur chaque fois que vous souhaitez mettre à jour. Si vous souhaitez qu’il soit vraiment automatique, vous pourriez être intéressé par un outil appelé Watchtower.
Watchtower est un utilitaire qui s’exécute sur votre hôte Docker et vérifie périodiquement les mises à jour des conteneurs. S’il détecte une nouvelle version d’une image à partir du registre de conteneurs, il tuera automatiquement le conteneur et le redémarrera immédiatement.
C’est une fonctionnalité très attrayante, mais avant de l’installer, il est important de discuter des inconvénients. Faire des mises à jour entièrement automatiquement signifie que vous aurez moins de contrôle sur le temps et les tests préalables du déploiement, car chaque fois que la validation dans votre référentiel passe et déclenche une construction, les conteneurs en cours d’exécution seront mis à jour. Si vous ne possédez pas l’image en cours d’exécution, elle peut être mise à jour de manière inattendue si vous ne les excluez pas de Watchtower.
Si vous ne faites pas de mises à jour tous les jours, vous feriez peut-être mieux d’utiliser une interface graphique Docker comme Portainer, qui vous permet de parcourir les conteneurs en cours d’exécution sur vos serveurs et de cliquer sur un bouton pour les mettre à jour automatiquement. Cela vous donne plus de contrôle sur le processus et peut aider à prévenir les mises à jour inattendues.
Si vous souhaitez commencer à utiliser Portainer, vous pouvez lire notre guide de configuration pour en savoir plus.
Utiliser la tour de guet
Watchtower est emballé comme un conteneur Docker lui-même, il est donc assez facile à installer – une seule commande le fera fonctionner :
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Cela lance un conteneur Watchtower et crée également un montage contraignant le docker.sock
de l’hôte afin qu’il puisse interagir avec l’API Docker. Par défaut, cela analyse tous les conteneurs en cours d’exécution pour les mises à jour toutes les 24 heures, ce qui peut être modifié avec le --interval
drapeau.
Vous pouvez également créer un docker-compose.yml
fichier pour démarrer Watchtower en tant que service :
version: "3" services: watchtower: image: containrrr/watchtower restart: always volumes: - /var/run/docker.sock:/var/run/docker.sock - /root/.docker/config.json:/config.json command: --interval 300
« Tous les conteneurs en cours d’exécution » incluent probablement certaines choses que vous préférez ne pas mettre à jour de manière inattendue, y compris des images du Docker Hub sur lesquelles vous n’avez pas de contrôle. Vous pouvez exclure des conteneurs des mises à jour, mais uniquement en définissant une étiquette sur le conteneur en cours d’analyse.
Vous devrez soit définir cet indicateur sur la ligne de commande pendant docker run
ou spécifiez-le dans le processus de construction du conteneur à l’aide de la LABEL
directif.
docker run -d --label=com.centurylinklabs.watchtower.enable=false nginx LABEL com.centurylinklabs.watchtower.enable="false"
Vous pouvez aussi faire l’inverse, en passant le --label-enable
drapeau lors du démarrage de Watchtower et de la définition des conteneurs sur « true ».
Exécution de Watchtower en tant que service Docker Compose
Une meilleure méthode, en particulier lorsque vous n’avez besoin d’exécuter Watchtower que pour un seul conteneur, consiste à le regrouper dans un conteneur existant. docker-compose.yml
fichier et créez une portée que Watchtower doit rechercher. Dans cet exemple, l’image NGINX reçoit la portée « nginx » et la Watchtower est configurée pour mettre à jour uniquement les conteneurs avec cette étiquette de portée.
version: '3' services: nginx: image: nginx labels: - "com.centurylinklabs.watchtower.scope=nginx" watchtower: image: containrrr/watchtower volumes: - /var/run/docker.sock:/var/run/docker.sock command: --interval 300 --scope nginx labels: - "com.centurylinklabs.watchtower.scope=nginx"
Si vous n’utilisez que Watchtower de cette façon – emballé dans un fichier de composition avec une portée – cela vous permettra d’exécuter plusieurs instances. Si vous exécutez Watchtower sans étendue sur le même système, cela remplacera ces instances.
Utilisation de registres tiers
Par défaut, Watchtower ne fonctionne qu’avec Docker Hub et tout autre registre public. Cela exclut certains services comme le registre de conteneurs de Github, qui nécessite un nom d’utilisateur et un jeton d’accès personnel (PAT) pour extraire des images.
Vous pouvez ajouter une configuration pour les registres privés en créant un config.json
fichier avec le contenu suivant :
{ "auths": { "ghcr.io": { "auth": "credentials" } } }
La valeur « informations d’identification » doit être définie sur une chaîne encodée en base64 de votre username:password
combo, ou jeton d’accès personnel dans le cas de Github.
echo -n 'username:password' | base64
Ensuite, lorsque vous exécutez Watchtower, passez une monture supplémentaire pour cela config.json
dossier.
docker run -d -v config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower