Le prototype de l’application Libra est conteneurisé ! Liam est extatique. Partisan de la stratégie du “release early, release often” il vous presse de mettre une instance de démonstration en ligne dans le but de montrer vos avancées aux investisseurs. Il est temps de réfléchir à la mise en production !
Préparez votre déploiement
Pour déployer et maintenir efficacement une application conteneurisée, il est essentiel de comprendre le cycle complet de déploiement et de maintenance. Voici certaines des étapes clés à considérer :
Construction de l’image : Vous avez déjà acquis cette compétence.
Étiquetage des images : Une bonne stratégie d’étiquetage est cruciale pour la gestion des versions.
Déploiement de l’image : Vous connaissez déjà les commandes vous permettant d’exécuter et stopper un conteneur Docker. Nous verrons un peu plus tard dans cette partie comment déployer des environnements complexes avec Docker Compose.
Sauvegarde et restauration des données : Cette étape est critique pour la sécurité de toute infrastructure numérique. Planifiez des sauvegardes régulières pour éviter toute perte de données !
Définissez votre stratégie d’étiquetage
En manipulant les images avec les commandes Docker, vous avez dû voir que les noms d’image étaient construits de la manière suivante :<nom_image>:<tag>
. Un “tag” est une étiquette (métadonnée) associée à une image, qui permet de l’identifier plus facilement.
Mais d’ailleurs, il existe d’autres moyens pour identifier les images ?
Oui, tout à fait ! Le système de stockage des images Docker utilise un mécanisme d’adressage par empreinte de contenu (“content-adressable”). Ainsi chaque image est également identifiée par une empreinte SHA256 générée à partir de son contenu ainsi que ses métadonnées. Chaque modification du Dockerfile ou des métadonnées associées entraîne donc la création d’un nouvel identifiant !
Si vous avez été attentif, vous devez avoir également identifié la présence récurrente du tag latest
sur de nombreuses images. Celui-ci est le tag par défaut associé à une image lors de lors construction. Cependant, il est recommandé d'utiliser des tags spécifiques pour gérer les versions de vos applications.
Les tags Docker ne sont pas soumis à un format spécifique. Il vous appartient donc de définir votre propre stratégie pour générer ceux-ci. Parmi les stratégies les plus courantes, on retrouve :
Semver (Version Sémantique): Utilisez des tags comme
v1.0.0
,v1.1.0
, etc. Cela permet de suivre les versions majeures, mineures et autres patchs.Date-based : Utilisez des dates comme
2024-07-17
. C’est une stratégie utile pour les versions déployées quotidiennement ou hebdomadairement.Environment-specific : Utilisez des tags comme
dev
,staging
,prod
pour distinguer les environnements.
Ces stratégies sont composables et adaptables aux besoins de vos propres projets. Gardez seulement en tête qu’il est important de maintenir une certaine cohérence d’ensemble afin d’identifier la ligne de continuité entre les différentes images générées.
Appliquez et supprimez des tags avec les commandes Docker
Pour appliquer un tag à une image Docker, utilisez la commandedocker tag
:
docker tag <tag> <nom_image:tag_actuel>
Par exemple :
docker tag v0.0.1 libra:latest
Pour supprimer un tag, utilisez la commandedocker rmi
:
docker rmi <nom_image:tag>
Par exemple :
docker rmi libra:v0.0.1
Vous savez désormais identifier de manière efficace les différentes versions de vos images, ce qui vous permettra de livrer les évolutions de vos applications sur vos différents environnements d’exploitation.
Voyons maintenant comment gérer les sauvegardes et les restaurations, étape obligatoire pour la mise en place d’un cycle de livraison pérenne.
Sauvegardez et restaurez votre application
Il est crucial de sauvegarder régulièrement vos applications conteneurisées pour éviter toute perte de données. Deux stratégies sont disponibles nativement avec Docker :
Stratégie | Avantage(s) | Inconvénient(s) |
Les “snapshots” avec `docker export/import` |
|
|
Le conteneur “sidecar” avec des volumes partagés |
|
|
Dans les vidéos suivantes, nous verrons ensemble comment appliquer concrètement ces deux stratégies. Commençons par la technique la plus simple à mettre en place, la technique des “snaphots” :
Dans cette vidéo, nous allons voir comment utiliser la stratégie des snapshots afin de réaliser une sauvegarde d’un conteneur complet et sa restauration
Cette technique, bien que très simple à mettre en place, est également assez limitée notamment lorsqu’il est nécessaire de sauvegarder des données “vivantes”, stockées dans des volumes. Dans ce cas, il sera préférable d’utiliser une seconde technique, la technique du conteneur “sidecar” :
Dans cette vidéo, nous avons vu comment utiliser la stratégie du conteneur “sidecar” afin de réaliser une sauvegarde à chaud d’un conteneur et ses volumes associés, puis une restauration des données sauvegardées.
Armés de ces connaissances, vous êtes désormais capable de déployer et de maintenir une application conteneurisée en production ! Il est temps pour vous de passer à la pratique.
À vous de jouer
Contexte
Dans un couloir, Sarah, la CTO, vous interpelle :
J’ai entendu que Liam voulait que tu déploies le PoC de Libra. Je sais qu’il veut aller vite, mais j’aimerais être certain qu’on sache sauvegarder et restaurer l’application avant de la mettre dans les mains du panel de testeurs…
Comme la plupart des applications, Libra stocke des données persistantes, notamment les fichiers chiffrés à transférer entre les avocats et leurs clients. Il vous faut démontrer à Sarah que vous êtes en mesure de mettre en pratique ce que vous avez appris sur la sauvegarde et la restauration afin de pérenniser le déploiement du service !
Dans son intégration sous forme de conteneur, Libra n’utilise que le répertoire/uploads
afin de stocker ses données persistantes.
Consignes
Utilisez la stratégie du conteneur “sidecar” afin de réaliser la sauvegarde des données persistantes de Libra
Utilisez les données sauvegardées pour réaliser une restauration des données de l’application Libra.
Vérifiez votre travail à l’aide de cet exemple de corrigé
Démarrer votre conteneur
docker run -it --rm -p 8080:8080 --name libra libra:latest
Réaliser la sauvegarde
docker run --rm --volumes-from libra -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /uploads
Restaurer une sauvegarde
docker run -it –rm –volumes-from libra -v $(pwd):/backup ubuntu /bin/bash -c “cd /uploads && rm -rf /uploads/* && tar -xzf /backup/backup_<date>.tar.gz –strip 1”
En résumé
Il est essentiel de bien prévoir le cycle de déploiement dans son entièreté afin de s’assurer que celui-ci se passera dans les meilleures conditions possibles.
Utilisez des conventions de tagging comme Semver, date-based ou environnement-specific pour gérer les versions de vos applications et faciliter vos déploiements.
Sachez identifier la bonne stratégie de sauvegarde et restauration pour vos applications conteneurisées. De manière générale, si vos applications ont des données persistantes, la stratégie “sidecar” sera celle à privilégier.
Notre déploiement étant maintenant préparé, il est temps de publier notre image !