Utilisation de Docker : démarrage et bonne pratique
Vous vous demandez comment commencer avec Docker ?
Lorsque l’on mène des audits d’applications, il est rare que nous rencontrions Docker. C’est dommage, particulièrement dans le contexte d’un projet en maintenance. En effet, Docker est une plateforme qui permet de développer, de déployer et de gérer des applications dans des conteneurs. Les conteneurs sont des environnements portables qui encapsulent une application et toutes ses dépendances, y compris les bibliothèques et les fichiers système.
Docker est devenu incontournable car il simplifie considérablement la gestion des dépendances et l’isolation des applications. Quelques explications pour savoir par où commencer avec Docker …
1. Pourquoi commencer avec Docker ?
Comme Docker permet de reproduire facilement des environnement d’exécution, cela présente de nombreux avantages :
Isolation des applications : l’utilisation d’un conteneur, pour isoler une application et ses dépendances, permet de garantir le fonctionnement de l’application quels que soient les environnements d’exécution.
Portabilité : Les conteneurs Docker sont portables, ce qui signifie que vous pouvez les exécuter sur n’importe quel système, que ce soit un ordinateur de développement, un serveur de production, un cloud public ou privé.
Environnements de développement reproductibles : chaque membre de l’équipe travaille dans un environnement identique, ce qui réduit les erreurs liées aux différences entre les environnements de développement.
Intégration continue et déploiement continu (CI/CD) : Docker peut être intégré dans les pipelines CI/CD pour automatiser la construction, les tests et le déploiement d’applications.
Gestion des versions : Chaque image Docker peut être étiquetée avec une version spécifique. Cela facilite le suivi des versions et le déploiement de mises à jour.
Enfin, Docker dispose d’un vaste écosystème d’outils et de services complémentaires, tels que Docker Compose, Kubernetes, Docker Swarm, AWS (ECS), GCP (GKE) et autres dérivés qui permettent d’assurer l’exécution des container, superviser leur état, scaler horizontalement (up et down), faire du déploiement sans interruption (et même des deploiement partiels type canary deployment pour fournir la version plus à jour de l’application à X% des utilisateurs pour un déploiement progressif).
Tout cela avec une plus grande facilité par rapport aux modèles classiques (ssh, puppet, ansible et des outils spécifiques aux différents hébergeurs).
2. Une image pour php / nodeJs
The coding machine maintient une image spécialement designée pour les applications web sous PHP et NodeJs (notre stack de prédilection). Cette image est accessible ici : https://hub.docker.com/r/thecodingmachine/php en open source et gratuitement.
3. Rappel des principales commandes pour commencer à utiliser Docker
docker build : Permet de créer une image Docker à partir d’un fichier Dockerfile. Vous devez exécuter cette commande dans le répertoire contenant le Dockerfile. docker build -t mon-image
docker run : Cette commande permet de lancer un conteneur Docker en spécifiant l’image à utiliser et diverses options, telles que les ports à exposer, les volumes à monter, les variables d’environnement, etc.
docker run -d -p 8080:80 --name mon-conteneur mon-image
lancera un conteneur basé sur l’image « mon-image » et exposera le port 80 à l’extérieur du conteneur sur le port 8080 de votre système.
docker pull : Utilisé pour télécharger une image Docker depuis un registre Docker public ou privé.docker pull nom-image
docker push : Utilisé pour pousser une image Docker vers un registre Docker après vous être authentifié.docker push nom-utilisateur/mon-image
docker ps : Affiche la liste des conteneurs en cours d’exécution. Pour voir tous les conteneurs, y compris ceux qui ne sont plus en cours d’exécution, utilisez docker ps -a.
docker stop : Cette commande permet d’arrêter un conteneur en cours d’exécution en spécifiant son ID ou son nom.docker stop mon-conteneur
docker rm : Utilisé pour supprimer un conteneur qui n’est plus en cours d’exécution en spécifiant son ID ou son nom.docker rm mon-conteneur
docker images : Affiche la liste des images Docker disponibles sur votre système.
docker rmi : Supprime une image Docker en spécifiant son ID ou son nom.docker rmi mon-image
docker exec : Permet d’exécuter une commande à l’intérieur d’un conteneur en cours d’exécution.docker exec -it mon-conteneur bash
docker logs : Affiche les journaux (logs) d’un conteneur en cours d’exécution. Vous devez spécifier le nom ou l’ID du conteneur.
docker network : Cette commande permet de gérer les réseaux Docker, y compris la création de réseaux personnalisés pour connecter des conteneurs entre eux.
docker volume : Utilisé pour gérer les volumes Docker, qui sont utilisés pour stocker des données persistantes en dehors des conteneurs.
docker compose : Docker Compose est un outil qui permet de gérer des applications multi-conteneurs à l’aide d’un fichier YAML. Il offre des commandes telles que docker compose up, docker compose down, docker compose ps, etc.
docker login : Permet de vous connecter à un registre Docker.
Il existe de nombreuses autres commandes Docker pour effectuer des tâches plus avancées, comme la gestion des secrets, la gestion des configurations, etc. Et, voici peut-être la commande la plus importante :
docker --help
Pour bien commencer avec Docker, nous vous recommandons de bien lire les 8 bonnes pratiques que nous avons listées ci-dessous. N’hésitez pas également à consulter notre page sur la technologie Docker.
4. Bonnes pratiques pour utiliser Docker
Voici quelques bonnes pratiques pour bien commencer avec Docker :
- Utilisation de Dockerfiles : Créer des Dockerfiles bien structurés et optimisés. Utilisez des images de base légères, réduisez le nombre de couches en regroupant les commandes du même type… sans oublier de supprimer les fichiers temporaires à chaque couche.
- Gestion des volumes : Utilisez les volumes Docker pour persister les données. Cela permet de séparer les données applicatives de l’image du conteneur, facilitant la mise à jour des conteneurs sans perte de données. Les outils comme kubernetes sont généralement déployés avec des implémentations pour les volumes associés avec l’hébergeur (pour héberger le volume sur un stockage de type S3, ou sur un système de volume partagé comme longhorn).
- Réseau Docker : Maîtrisez les aspects réseaux de Docker pour connecter efficacement vos conteneurs, que ce soit via des réseaux définis par l’utilisateur ou le réseau par défaut. De même, les hébergeurs implémentent généralement dans kubernetes (ou équivalent) leur propre spécificités réseau via des ingress pour autoriser des configurations plus avancées (provisionnement d’adresse ip publique, loadbalancer, reverse proxy, …).
- Optimisation des images : utilisez des outils comme Docker Slim ( https://github.com/slimtoolkit/slim ) pour réduire la taille des images Docker. Des images plus petites se déploient plus rapidement et sont plus sécurisées en réduisant la surface d’exposition sur les librairies non utilisées.
- Multi-stage builds : Utilisez les constructions en plusieurs étapes pour réduire la taille des images en ayant des étapes distinctes selon l’usage (dev local, test du ci/cd, version stable preproduction/production) sans multiplier les Dockerfile.
- Utilisation de .dockerignore : Similaire à .gitignore, utilisez un fichier .dockerignore pour exclure les fichiers non nécessaires de vos images, réduisant ainsi leur taille (vendor, noed_modules, données utilisateurs, documentation, …)
- Sécurité : Gardez un œil sur la sécurité en scannant régulièrement vos images avec des outils comme Docker Scout et en utilisant des images de base officielles ou maintenues par une communauté active.
- Orchestration avec Docker Compose, Kubernetes ou Swarm : Utilisez Docker Compose pour gérer des applications multi-conteneurs en développement, il montera ses limites en production pour des usages plus avancés. Docker Swarm ou Kubernetes offriront d’avantages pour un environnement de production avec une configuration plus complexe (cluster multi nodes, loadbalancing, gestion des secrets, des volumes, sondes de surveillance, etc).
Pour conclure
Pour commencer avec Docker est devenu très rapidement incontournable dans le cycle de vie d’une application. Pour moi, il a remplacé en local Vagrant (et PuPHPet : https://github.com/puphpet/puphpet ) dans ma pratique du développement web et s’est imposé peu à peu dans notre intégration continue, notre déploiement continue et même en production ou sur des outils que nous aurions eu l’habitude d’installer sur nos machines et que nous pouvons maintenant containeriser.
Au-delà de la flexibilité offerte, c’est comme son nom le suggère un très bon moyen de cloisonner et donc d’augmenter la sécurité des applications. J’espère que cet article vous donnera envie de travailler avec ce super outil que l’on utilise tous les jours… Et si comme nous vous travaillez avec PHP et NodeJs, nous vous invitons à essayer notre image https://hub.docker.com/r/thecodingmachine/php !
Si vous avez besoin de conseils pour mettre en place docker sur vos projets ou utiliser notre image docker, n’hésitez pas à me contacter !