Introduction à Docker Compose
Mise à jour :
Docker Compose est un outil puissant permettant de définir et de gérer des applications conteneurisées multi-services en utilisant un simple fichier YAML. Il simplifie l’orchestration des conteneurs Docker en automatisant leur création, leur configuration et leur mise en réseau. Grâce à Docker Compose, il est possible de déployer et de maintenir des environnements complexes avec un minimum d’effort, tout en garantissant la reproductibilité et la portabilité des configurations. Ce guide explore les fonctionnalités essentielles de Docker Compose, de son installation à la gestion avancée des réseaux et des volumes.
Concepts de base
Docker Compose repose sur plusieurs objets fondamentaux pour orchestrer des applications conteneurisées :
- Services : Un service correspond à un conteneur Docker défini dans le fichier YAML. Chaque service décrit un aspect de l’application, comme une base de données, une API, ou une interface utilisateur.
- Volumes : Les volumes sont des espaces de stockage partagés entre conteneurs pour persister les données au-delà du cycle de vie des conteneurs.
- Réseaux : Les réseaux permettent aux services de communiquer entre eux. Docker Compose crée automatiquement un réseau par défaut, mais il est aussi possible de configurer des réseaux personnalisés.
- Fichier
docker-compose.yml
: Ce fichier est le cœur de Docker Compose. Il décrit la configuration des services, les volumes à monter, les réseaux à utiliser et d’autres options de déploiement.
Ces concepts de base sont essentiels pour comprendre et utiliser efficacement Docker Compose dans la gestion d’applications multi-services.
Installation de docker-compose
On vérifie :
Structure d’un fichier Docker Compose
Le fichier docker-compose.yaml
définit l’ensemble des services
qui composent votre application, ainsi que leurs configurations, les réseaux et
les volumes associés. Voici une structure de base d’un fichier Docker Compose :
Configuration des services
Commençons maintenant par inspecter les principaux paramètres d’un service.
Les images
Si l’image dont nous avons besoin pour notre service a déjà été publiée dans une registry, alors nous il utiliser la référence avec l’attribut image :
Il est aussi possible de créer une image à partir du code d’un fichier
Dockerfile
, avec le paramètre build
. Ce paramètre peut être un chemin ou une
Url :
Il est possible d’ajouter le paramètre image qui taguera l’image une fois créée. Ce qui permet de la rendre disponible pour d’autres services :
La gestion des dépendances entre services
La directive depends_on
permet de définir des dépendances entre les services.
Elle spécifie qu’un service donné dépend d’un ou plusieurs autres services avant
de pouvoir être démarré. Cela permet de garantir que les services requis sont
opérationnels avant de lancer un service dépendant.
L’utilisation de depends_on
est particulièrement utile lorsque vous avez une
application composée de plusieurs services et que certains d’entre eux ont
besoin d’attendre que d’autres services soient prêts avant de pouvoir
fonctionner correctement. Voici comment cela fonctionne :
Supposons que vous ayez une application composée de deux services : un service de base de données (par exemple, PostgreSQL) et un service d’application web (par exemple, un serveur Node.js). Le service d’application web dépend de la base de données pour fonctionner correctement.
Dans cet exemple, le service app
dépend du service db
. Lorsque vous utilisez
docker-compose up
pour lancer l’ensemble de l’application, Docker Compose
veillera à ce que le service db
soit démarré en premier, puis seulement le
service app
sera lancé. Cela garantit que le service d’application web a accès
à la base de données dès son démarrage.
Il est important de noter que bien que depends_on
permette de gérer l’ordre de
démarrage des services, il ne garantit pas que le service dépendant a terminé
son initialisation avant de démarrer le service dépendant. Certains services
peuvent être prêts à accepter des connexions plus rapidement que d’autres. Pour
gérer la synchronisation des dépendances plus avancées, vous devrez peut-être
utiliser des outils supplémentaires ou des scripts dans vos conteneurs.
Configuration des réseaux
Les conteneurs Docker communiquent entre eux dans des réseaux créés, implicitement ou via la configuration du même nom.
Vous pouvez spécifier le type de réseau (par exemple, bridge pour un réseau privé), ce qui permet aux services de communiquer entre eux de manière sécurisée.
Exposition de ports
Pour atteindre un port d’un conteneur depuis l’hôte, il doit être exposé de
manière déclarative via le mot-clé ports
:
Le premier chiffre indique le port sur l’hôte et le second celui du conteneur. Ainsi le port 80 sera visible depuis l’hôte, tandis que le port 3000 des deux autres conteneurs seront disponibles sur les ports 8080 et 8081 de l’hôte. Cela permet d’exécuter différents conteneurs exposant les mêmes ports sans collisions.
Les volumes
La directive volumes
permet de configurer des volumes
nommés qui peuvent être réutilisés sur plusieurs services. Pour utiliser un
volume sur plusieurs services, vous devez explicitement accorder l’accès à
chaque service à l’aide de l’attribut volumes
.
Les variables d’environnement
Il est possible de définir des variables d’environnement statiques, ainsi que
des variables dynamiques, avec la notation ${}
:
On peut par exemple les définir dans un fichier .env dans le même répertoire.
La gestion des secrets
Dans un environnement DevOps, la gestion des secrets est une préoccupation importante pour garantir la sécurité des données sensibles, telles que les informations d’authentification, les clés API et les autres données confidentielles utilisées par les applications. Docker Compose offre des fonctionnalités pour gérer ces secrets de manière sécurisée. Dans cette partie, nous allons explorer comment Docker Compose permet de gérer les secrets dans un environnement de déploiement.
Création de Secrets
Pour créer un secret dans Docker Compose, vous devez d’abord le définir dans un
fichier de configuration. Voici un exemple de définition de secret dans un
fichier docker-compose.yml
:
Dans cet exemple, nous avons défini un service myapp qui utilise un secret nommé
my_secret
. Le secret est défini en dehors de la section services, sous la
section secrets, avec un chemin vers un fichier my_secret.txt
qui contient la
valeur du secret.
Accès aux Secrets dans les Conteneurs
Les secrets définis dans Docker Compose sont montés dans les conteneurs en tant
que fichiers dans le répertoire /run/secrets/
. Les conteneurs peuvent y accéder
comme s’il s’agissait de fichiers normaux. Par exemple, si vous avez défini un
secret nommé my_secret
, le conteneur peut le lire depuis /run/secrets/my_secret
.
Sécurité des secrets
Les secrets définis dans Docker Compose sont stockés de manière sécurisée sur le système hôte. Ils sont uniquement accessibles par les conteneurs spécifiques qui en ont besoin, ce qui garantit leur confidentialité. De plus, Docker Compose permet de chiffrer les secrets en transit entre les services, renforçant ainsi la sécurité de l’ensemble du processus.
Les commandes de la CLI
Examinons maintenant de plus près la syntaxe de Docker Compose :
Bien qu’il existe de nombreuses options et commandes disponibles, nous devons au moins connaître celles qui permettent de lancer et d’arrêter les services.
Premier lancement
Pour démarrer les conteneurs, les réseaux et les volumes définis dans la
configuration, on utilise l’option up
:
Si le fichier de configuration a un nom différent de celui par défaut,
docker-compose.yml
, vous pouvez utiliser l’option -f
avec le nom du fichier
:
On peut aussi demander à docker compose de s’exécuter en arrière-plan en tant
que démon avec l’option -d
:
Stop
Pour arrêter les services actifs en toute sécurité, nous pouvons utiliser stop, qui préservera les conteneurs, les volumes et les réseaux, ainsi que toutes les modifications qui leur sont apportées :
Start
Cependant, après la première fois, nous pouvons simplement utiliser start
pour
démarrer les services :
Arrêt et nettoyage
Pour réinitialiser le statut de notre projet, nous pouvons simplement utiliser
la commande down
, ce qui détruira tout à l’exception des volumes externes :
Conclusion
Docker Compose est un outil incontournable pour orchestrer facilement des applications conteneurisées. En exploitant les concepts de base tels que les services, les réseaux et les volumes, il permet de gérer des environnements multi-services avec efficacité et simplicité. Les fonctionnalités offertes, comme la gestion automatique des réseaux, la persistance des données via les volumes et l’automatisation des tâches grâce aux commandes CLI, rendent Docker Compose indispensable pour déployer des applications cohérentes et reproductibles. Maîtriser Docker Compose vous aide à simplifier vos déploiements et à maintenir des configurations robustes.