Comment mettre à niveau les conteneurs Docker pour appliquer les mises à jour d’images –
Les conteneurs Docker sont destinés à être jetables et faciles à remplacer. Lorsqu’une nouvelle version de l’image de base d’un conteneur est publiée, vous devez extraire la nouvelle image et démarrer une nouvelle instance de conteneur. Voici comment gérer les mises à jour d’images sur l’ensemble de votre flotte de conteneurs.
Sommaire
Tirer de nouvelles images
La méthode de base pour appliquer une mise à jour d’image consiste à extraire la nouvelle image, à détruire les conteneurs en cours d’exécution basés sur l’ancienne version, puis à démarrer de nouveaux conteneurs à leur place.
Voici un exemple de conteneur utilisant le nginx:latest
image:
# Pull new image
docker pull nginx:latest
# Delete old container by name
docker rm example-nginx
# Start a new container
docker run -d -p 80:80 --name example-nginx nginx:latest
Docker ne dispose pas d’un moyen intégré pour détecter les mises à jour d’images et remplacer vos conteneurs en cours d’exécution. Le résultat est un processus de remplacement manuel compliqué. Cela peut être simplifié en utilisant Docker Compose pour démarrer vos conteneurs au lieu du simple docker run
commander.
Remplacement des conteneurs avec Docker Compose
Docker Compose vous permet de créer des représentations déclaratives de piles de conteneurs à l’aide d’un docker-compose.yml
déposer. La pile est démarrée avec docker-compose up
, en utilisant la configuration contenue dans le fichier. Cela remplace la longue liste de drapeaux habituellement donnée à docker run
.
Docker Compose a un pull
commande qui extraira les versions mises à jour de toutes les images de votre pile. C’est toujours une procédure en deux étapes car vous devez exécuter manuellement docker-compose up
encore après.
# Pull all images in the stack
docker-compose pull
# Restart the stack
# If a new image version has been pulled, containers
# using the old tag will be replaced with new instances.
docker-compose up -d
Docker Compose offre une expérience plus simple et plus mémorable où vous n’avez pas besoin de taper des noms d’image ou de vous souvenir des drapeaux que vous avez transmis docker run
. Les deux commandes peuvent être facilement raccourcies en un seul alias shell :
alias composePullUp="docker-compose pull && docker-compose up -d"
Vous devez référencer la balise correcte lorsque vous extrayez des images manuellement. Docker Compose s’en chargera pour vous et sélectionnera les balises spécifiées dans votre docker-compose.yml
.
Extraire la nouvelle version d’une balise n’est pas nécessairement la même chose que d’utiliser la version la plus récente d’une image. Si vous souhaitez utiliser la dernière version du logiciel à l’intérieur le conteneur, faites attention aux pratiques de balisage de l’auteur de l’image.
Par exemple, extraire une nouvelle version de node:14
vous obtiendrez la dernière version du correctif de Node.js 14. Tirer node:latest
fournira la version la plus récente de Node.js, actuellement 16. Si un ancien conteneur utilisait cette image, un processus d’extraction et de remplacement déclencherait une modification majeure de la version du binaire Node à l’intérieur du conteneur.
Reconstruire des images
Jusqu’à présent, nous avons vu comment gérer les conteneurs démarrés à partir d’images que vous extrayez directement de Docker Hub ou d’un autre registre. Les images que vous créez vous-même doivent être reconstruites lorsque leur image de base change.
Reconstruisez d’abord l’image :
docker build --pull -t my-image:latest .
Remplacez ensuite vos conteneurs :
# Delete old container by name
docker rm my-container
# Start a new container
docker run -d --name my-container my-image:latest
Les --pull
drapeau donné à docker build
demande à Docker d’extraire l’image de base référencée dans votre Dockerfile
. Sans cet indicateur, Docker réutiliserait la référence de balise existante si l’image était déjà présente sur le système.
Les utilisateurs de Docker Compose peuvent obtenir les mêmes résultats avec les docker-compose
commandes :
docker-compose build --pull
docker-compose up -d
Compose propose à nouveau un processus plus simple, quoique toujours en deux étapes. Vous pouvez oublier des noms d’images et des balises spécifiques, au lieu de faire confiance à Compose pour extraire les images de base modifiées, reconstruire vos calques dessus, puis recréer vos conteneurs.
Logiciel à l’intérieur des conteneurs
Parfois, il peut être tentant de mettre à jour manuellement le logiciel à l’intérieur vos conteneurs. Cela devrait être évité car cela reprend les principes de Docker.
Fonctionnement apt-get update && apt get upgrade -y
selon un calendrier (ou les homologues de votre gestionnaire de packages) est une pratique standard lors de l’administration d’un serveur Linux bare metal. Ces commandes ne sont normalement pas exécutées dans un conteneur Docker, bien qu’elles puissent être incluses dans le cadre d’un Dockerfile
pour obtenir les derniers correctifs de sécurité lors de la création d’une image.
Tirer périodiquement l’image de base et recréer vos conteneurs est la meilleure façon de les maintenir à jour. Cela vous donne tous les correctifs de sécurité en amont et raccourcit la durée de vie des conteneurs individuels. Les environnements de conteneur ne sont pas destinés à être modifiés après la création d’une instance ; les modifications du système de fichiers doivent être limitées aux écritures sur les chemins temporaires et les volumes Docker dédiés qui survivent au conteneur.
Automatisation des mises à jour des conteneurs
Vous pouvez automatiser le processus de vérification des balises d’image mises à jour et redémarrer vos conteneurs à l’aide de projets tiers. Watchtower est un choix populaire qui surveille les conteneurs en cours d’exécution et les remplace lorsque leur image Docker Hub change.
Watchtower elle-même est déployée en tant que conteneur :
docker run -d -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower
Vous avez maintenant une installation Watchtower fonctionnelle. Le socket Docker de votre hôte est monté dans le conteneur Watchtower, ce qui lui permet d’exécuter des commandes Docker pour créer et supprimer des conteneurs.
Watchtower détectera automatiquement les nouvelles versions d’images sur Docker Hub, les tirera sur votre machine et remplacera les conteneurs à l’aide de l’image. Les conteneurs existants seront fermés et de nouveaux identiques créés à leur place. Les mêmes drapeaux que tu as donnés à docker run
seront fournis aux conteneurs de remplacement.
Watchtower ne fonctionne qu’avec Docker Hub par défaut. Vous pouvez l’utiliser avec des registres d’images privés en fournissant des informations d’identification dans un fichier de configuration.
Créez un fichier JSON avec le contenu suivant :
{
"auths": {
"example.com": {
"auth": "credentials"
}
}
}
Remplacer example.com
avec le chemin de votre registre.
Ensuite, générez une chaîne d’informations d’identification à partir de votre nom d’utilisateur et de votre mot de passe de registre :
echo -n 'username:password' | base64
Collez la chaîne encodée en Base64 résultante dans le fichier de configuration, en remplaçant le credentials
texte d’espace réservé.
Montez le fichier de configuration dans votre conteneur Watchtower pour permettre l’accès à votre registre :
docker run -d
-v config.json:/config.json
-v /var/run/docker.sock:/var/run/docker.sock
containrrr/watchtower
Conclusion
Docker ne dispose d’aucun mécanisme pour détecter et appliquer les mises à jour d’images en amont à vos conteneurs en cours d’exécution. Vous pouvez soit utiliser les commandes Docker CLI dans l’ordre, docker-compose
comme une abstraction de niveau supérieur, ou un outil tiers comme Watchtower pour remplacer vos conteneurs lorsque de nouvelles versions d’images sont publiées.
Selon votre situation, vous ne ressentirez peut-être pas du tout le besoin de mettre à niveau les conteneurs de cette manière. Si votre équipe utilise des pipelines CI pour créer une image Docker à chaque validation, vous êtes peut-être déjà en train de produire et de déployer des images mises à jour plusieurs fois par jour. Dans ce cas, assurez-vous d’utiliser le --pull
drapeau avec docker build
les correctifs en amont sont donc inclus dans vos images.