Comment mettre à jour automatiquement les conteneurs Docker à partir de votre registre d'images
Agence web » Actualités du digital » Comment mettre à jour automatiquement les conteneurs Docker à partir de votre registre d’images

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.

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.

Écran de détails du conteneur de Portainer

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 runou 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

★★★★★