Comment installer et utiliser Docker Compose sur Ubuntu
Introduction
Docker simplifie le processus de gestion des processus d'application dans des conteneurs. Bien que les conteneurs présentent certaines similitudes avec les machines virtuelles, ils sont plus légers et consomment moins de ressources. Cela permet aux développeurs de décomposer un environnement d'application en plusieurs services isolés.
Pour les applications dépendant de plusieurs services, orchestrer tous les conteneurs pour qu'ils démarrent, communiquent et s'arrêtent ensemble peut rapidement devenir ingérable. Docker Compose est un outil qui vous permet d'exécuter des environnements d'applications multi-conteneurs basés sur des définitions définies dans un fichier YAML. Il utilise des définitions de services pour créer des environnements entièrement personnalisables avec plusieurs conteneurs pouvant partager des réseaux et des volumes de données.
Ce guide vous expliquera comment installer Docker Compose sur un serveur Ubuntu et exécuter un conteneur simple. Ensuite, vous apprendrez à créer un environnement multi-services en utilisant une application WordPress et une base de données MySQL. Nous aborderons également des sujets plus avancés, notamment la mise à l'échelle des services, la définition de réseaux personnalisés et l'utilisation de directives d'inclusion modulaires. Enfin, cet article fournit un guide de migration de l'ancien docker-compose (v1) vers le moderne docker compose (v2) et une section détaillée sur le dépannage des problèmes courants tels que les conflits de ports et les erreurs de permissions.
Points clés :
- Docker Compose est un outil permettant de définir et d'exécuter des applications multi-conteneurs en utilisant un seul fichier YAML pour configurer les services, les réseaux et les volumes.
- Docker Compose est installé sur Ubuntu en ajoutant le dépôt officiel de Docker et en utilisant
aptpour installer le paquetdocker-compose-plugin. - La commande moderne est
docker compose(avec un espace). Elle remplace l'outil v1 obsolètedocker-compose(avec un trait d'union). - Utilisez
docker compose up -dpour démarrer une application en mode détaché etdocker compose downpour arrêter et supprimer tous ses conteneurs et réseaux. - La directive
depends_onaide à contrôler l'ordre de démarrage des services, par exemple en garantissant qu'un conteneur de base de données démarre avant un conteneur d'application web. - Les problèmes les plus fréquents sont « Permission refusée » (résolu en ajoutant votre utilisateur au groupe
docker), les conflits de ports (résolus en modifiant le port hôte dans le fichier YAML) et les erreurs de syntaxe YAML (résolues en corrigeant l’indentation). - Vous pouvez exécuter plusieurs instances d'un service en utilisant la commande
docker compose up --scale <service_name>=<number>. - La directive
includepermet de diviser un large fichierdocker-compose.ymlen fichiers de configuration plus petits et plus faciles à gérer.
Prérequis
Pour suivre cet article, vous aurez besoin de :
- Accès à une machine locale Ubuntu ou à un serveur de développement en tant qu’utilisateur non root avec des privilèges sudo. Si vous utilisez un serveur distant, il est conseillé d’avoir un pare-feu actif installé. Pour les configurer, veuillez vous référer à notre Guide de configuration initiale du serveur pour Ubuntu.
- Docker installé sur votre serveur ou votre machine locale, en suivant les étapes 1 et 2 du guide Comment installer Docker sur Ubuntu – Guide étape par étape.
Remarque : À partir de Docker Compose v2, Docker a migré vers l'utilisation de la commande plugin CLI compose, et s'éloigne de l'original docker-compose comme documenté dans notre guide « Comment installer Docker Compose sur Ubuntu (Guide étape par étape) ». Bien que l'installation diffère, en général, l'utilisation réelle consiste à supprimer le trait d'union des appels docker-compose pour devenir docker compose. Pour des détails complets sur la compatibilité, consultez la documentation officielle de Docker sur la compatibilité des commandes entre le nouveau compose et l'ancien docker-compose.
Étape 1 — Installer Docker Compose
Il existe deux façons d'installer Docker Compose sur Ubuntu :
- Installer via le dépôt
- Installer manuellement
Nous aborderons les deux manières dans cette section.
Installation de Docker Compose en utilisant le dépôt apt
Tout d'abord, configurons le dépôt Docker apt.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get updateMaintenant, vous pouvez installer Docker Compose en utilisant la commande suivante :
sudo apt install docker-compose-pluginDocker Compose est maintenant installé avec succès sur votre système. Pour vérifier que l'installation a réussi, vous pouvez exécuter :
docker compose versionVous verrez une sortie similaire à ceci :
Docker Compose version v2.3.3Installation manuelle de Docker Compose
Pour vous assurer d'obtenir la version stable la plus récente de Docker Compose, vous téléchargerez ce logiciel depuis son dépôt officiel sur Github.
Tout d'abord, confirmez la dernière version disponible sur leur page des releases. Au moment de la rédaction de cet article, la version stable la plus récente est v2.40.2.
Utilisez la commande suivante pour télécharger :
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.40.2/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-composeEnsuite, définissez les permissions correctes afin que la commande docker compose soit exécutable :
chmod +x ~/.docker/cli-plugins/docker-composeDans la section suivante, vous verrez comment configurer un fichier docker-compose.yml et démarrer un environnement conteneurisé avec cet outil.
Étape 2 — Configuration d'un fichier docker-compose.yml
Pour montrer comment configurer un fichier docker-compose.yml et travailler avec Docker Compose, vous allez créer un environnement de serveur web en utilisant l’image officielle Nginx depuis Docker Hub, le registre public de Docker. Cet environnement conteneurisé servira un seul fichier HTML statique.
Commencez par créer un nouveau répertoire dans votre dossier personnel, puis entrez dedans :
mkdir ~/compose-demo
cd ~/compose-demoDans ce répertoire, créez un dossier d'application qui servira de racine des documents pour votre environnement Nginx :
mkdir appEn utilisant votre éditeur de texte préféré, créez un nouveau fichier index.html dans le dossier app :
nano app/index.htmlPlacez le contenu suivant dans ce fichier :
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Docker Compose Demo</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css">
</head>
<body>
<h1>This is a Docker Compose Demo Page.</h1>
<p>This content is being served by an Nginx container.</p>
</body>
</html>Enregistrez et fermez le fichier une fois que vous avez terminé. Si vous utilisez nano, vous pouvez le faire en tapant CTRL+X, puis Y et ENTRÉE pour confirmer.
Ensuite, créez le fichier docker-compose.yml :
nano docker-compose.yml
Insérez le contenu suivant dans votre fichier docker-compose.yml :
services:
web:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app:/usr/share/nginx/htmlDans Docker Compose moderne, le champ version est optionnel et souvent omis, car Compose peut détecter automatiquement la version de la configuration. L'exemple ci-dessus n'inclut pas de champ version, ce qui est l'approche recommandée pour la plupart des nouveaux projets. Vous n'avez besoin de spécifier version que pour la compatibilité avec les anciens projets.
Vous avez ensuite le bloc services, où vous configurez les services qui font partie de cet environnement. Dans votre cas, vous avez un seul service appelé web. Ce service utilise l'image nginx:alpine et configure une redirection de port avec la directive ports. Toutes les requêtes sur le port 8000 de la machine hôte (le système à partir duquel vous exécutez Docker Compose) seront redirigées vers le conteneur web sur le port 80, où Nginx sera en cours d'exécution.
La directive volumes créera un volume partagé entre la machine hôte et le conteneur. Cela partagera le dossier local app avec le conteneur, et le volume sera situé à /usr/share/nginx/html à l'intérieur du conteneur, ce qui remplacera alors le répertoire racine par défaut de Nginx.
Enregistrez et fermez le fichier.
Vous avez mis en place une page de démonstration et un fichier docker-compose.yml pour créer un environnement de serveur web conteneurisé qui la servira. Dans l'étape suivante, vous allez lancer cet environnement avec Docker Compose.
Étape 3 — Exécution de Docker Compose
Avec le fichier docker-compose.yml en place, vous pouvez maintenant exécuter Docker Compose pour démarrer votre environnement. La commande suivante téléchargera les images Docker nécessaires, créera un conteneur pour le service web et exécutera l'environnement containerisé en mode arrière-plan :
docker compose up -dDocker Compose recherchera d'abord l'image définie sur votre système local, et si elle ne peut pas localiser l'image, elle la téléchargera depuis Docker Hub. Vous verrez une sortie comme ceci :
Creating network "compose-demo_default" with the default driver
Pulling web (nginx:alpine)...
alpine: Pulling from library/nginx
cbdbe7a5bc2a: Pull complete
10c113fb0c77: Pull complete
9ba64393807b: Pull complete
c829a9c40ab2: Pull complete
61d685417b2f: Pull complete
Digest: sha256:57254039c6313fe8c53f1acbf15657ec9616a813397b74b063e32443427c5502
Status: Downloaded newer image for nginx:alpine
Creating compose-demo_web_1 ... doneRemarque : Si vous rencontrez une erreur « permission refusée » lors de l’exécution de docker compose up, cela signifie généralement que votre utilisateur non-root n’a pas la permission d’accéder au socket du démon Docker.
Par défaut, le démon Docker se lie à un socket Unix (/var/run/docker.sock) qui est détenu par l’utilisateur root. Pour résoudre ce problème, vous devez ajouter votre utilisateur non-root au groupe docker, qui est créé lors de l’installation de Docker.
Exécutez la commande suivante pour ajouter votre utilisateur au groupe docker :
sudo usermod -aG docker ${USER}Après avoir exécuté cette commande, vous devrez vous déconnecter puis vous reconnecter pour que les modifications de groupe prennent effet. Vous pouvez également activer les modifications pour la session terminal actuelle en tapant :
newgrp dockerCette commande devrait résoudre toutes les erreurs de permission liées au socket Docker. Pour un guide complet, veuillez vous référer à l'Étape 2 de Comment installer Docker sur Ubuntu – Guide étape par étape.
Votre environnement est maintenant opérationnel en arrière-plan. Pour vérifier que le conteneur est actif, vous pouvez exécuter :
docker compose psCette commande vous montrera des informations sur les conteneurs en cours d'exécution et leur état, ainsi que sur toutes les redirections de ports actuellement en place :
Name Command State Ports
----------------------------------------------------------------------------------
compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcpVous pouvez maintenant accéder à l'application de démonstration en pointant votre navigateur vers localhost:8000 si vous exécutez cette démonstration sur votre machine locale, ou votre_domaine_ou_IP_serveur:8000 si vous exécutez cette démonstration sur un serveur distant.
Vous verrez une page comme celle-ci :
Le volume partagé que vous avez configuré dans le fichier docker-compose.yml maintient les fichiers de votre dossier app synchronisés avec la racine des documents du conteneur. Si vous apportez des modifications au fichier index.html, elles seront automatiquement prises en compte par le conteneur et donc reflétées sur votre navigateur lorsque vous actualiserez la page.
Dans l'étape suivante, vous verrez comment gérer votre environnement conteneurisé avec les commandes Docker Compose.
Étape 4 — Se familiariser avec les commandes Docker Compose
Vous avez vu comment configurer un fichier docker-compose.yml et démarrer votre environnement avec docker compose up. Vous allez maintenant voir comment utiliser les commandes Docker Compose pour gérer et interagir avec votre environnement conteneurisé.
Pour vérifier les journaux générés par votre conteneur Nginx, vous pouvez utiliser la commande logs :
docker compose logsVous verrez une sortie similaire à ceci :
Attaching to compose-demo_web_1
web_1 | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
web_1 | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
web_1 | 10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
web_1 | 10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
web_1 | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
web_1 | /docker-entrypoint.sh: Configuration complete; ready for start up
web_1 | 172.22.0.1 - - [02/Jun/2020:10:47:13 +0000] "GET / HTTP/1.1" 200 353 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36" "-"Si vous voulez mettre en pause l'exécution de l'environnement sans changer l'état actuel de vos conteneurs, vous pouvez utiliser :
docker compose pausePausing compose-demo_web_1 ... donePour reprendre l'exécution après avoir émis une pause :
docker compose unpauseUnpausing compose-demo_web_1 ... doneLa commande stop arrêtera l'exécution du conteneur, mais ne supprimera aucune donnée associée à vos conteneurs :
docker compose stopStopping compose-demo_web_1 ... doneSi vous souhaitez supprimer les conteneurs, réseaux et volumes associés à cet environnement conteneurisé, utilisez la commande down :
docker compose downRemoving compose-demo_web_1 ... done
Removing network compose-demo_defaultRemarquez que cela ne supprimera pas l'image de base utilisée par Docker Compose pour lancer votre environnement (dans votre cas, nginx:alpine). De cette façon, chaque fois que vous relancerez votre environnement avec un docker compose up, le processus sera beaucoup plus rapide puisque l'image est déjà présente sur votre système.
Si vous voulez également supprimer l'image de base de votre système, vous pouvez utiliser :
docker image rm nginx:alpineUntagged: nginx:alpine
Untagged: nginx@sha256:b89a6ccbda39576ad23fd079978c967cecc6b170db6e7ff8a769bf2259a71912
Deleted: sha256:7d0cdcc60a96a5124763fddf5d534d058ad7d0d8d4c3b8be2aefedf4267d0270
Deleted: sha256:05a0eaca15d731e0029a7604ef54f0dda3b736d4e987e6ac87b91ac7aac03ab1
Deleted: sha256:c6bbc4bdac396583641cb44cd35126b2c195be8fe1ac5e6c577c14752bbe9157
Deleted: sha256:35789b1e1a362b0da8392ca7d5759ef08b9a6b7141cc1521570f984dc7905eb6
Deleted: sha256:a3efaa65ec344c882fe5d543a392a54c4ceacd1efd91662d06964211b1be4c08
Deleted: sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741aRemarque : Veuillez consulter notre guide sur Comment installer Docker sur Ubuntu – Guide étape par étape pour une référence plus détaillée sur les commandes Docker.
Étape 5 — Construire une application multi-services
Le véritable atout de Docker Compose réside dans la gestion de plusieurs services qui fonctionnent ensemble. L'exemple de Nginx était un service unique. Créons une application plus pratique et multi-service : un site WordPress connecté à une base de données MySQL.
Cette configuration implique deux services : wordpress (exécutant l'application) et db (exécutant la base de données). Nous utiliserons également des volumes Docker pour garantir que les données de la base de données persistent même si le conteneur est supprimé.
Créons un nouveau répertoire pour cette application :
mkdir -p ~/compose-demo/wordpressapp
cd ~/compose-demo/wordpressappPour cet exemple, nous n’avons besoin d’aucun fichier local, car les images contiendront tous les logiciels nécessaires.
Créez un nouveau fichier docker-compose.yml :
nano docker-compose.ymlCollez la configuration suivante. Ce fichier est plus complexe, nous allons donc examiner chaque partie.
services:
db:
image: mysql:8.0
container_name: mysql_db
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: <^your_wordpress_password_here<^>
restart: unless-stopped
wordpress:
image: wordpress:latest
container_name: wordpress_app
ports:
- "8001:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wp_content:/var/www/html/wp-content
depends_on:
- db
restart: unless-stopped
volumes:
db_data:Remarque : Nous avons codé en dur les valeurs du mot de passe ici à des fins d'illustration. Lors de l'utilisation dans un environnement réel, assurez-vous d'utiliser des variables d'environnement dans le fichier .env afin de ne pas exposer vos informations d'identification.
Enregistrez et fermez le fichier. N'oubliez pas de remplacer les espaces réservés <^...^> par des mots de passe solides et sécurisés.
Décomposons les nouvelles directives dans ce fichier :
services: Ce bloc définit toujours nos conteneurs. Nous en avons maintenant deux :dbetwordpress.image: Nous utilisonsmysql:8.0pour la base de données et l’imagewordpress:latestpour l’application.container_name: Cela définit un nom spécifique et lisible par l’homme pour le conteneur, ce qui est plus facile à référencer que les noms générés automatiquement.environment: Il s'agit d'une liste de variables d'environnement transmises au conteneur. L'imagemysqlles utilise pour définir le mot de passe root et créer une base de données et un utilisateur initiaux. L'imagewordpressles utilise pour savoir comment se connecter à sa base de données.volumes(niveau de service):- Pour le service
db,db_data:/var/lib/mysqlassocie un volume géré par Docker nommédb_dataau répertoire de données MySQL à l'intérieur du conteneur. Cela permet de sécuriser vos données.
- Pour le service
- Pour le service
wordpress,./wp_content:/var/www/html/wp-contentmappe un répertoire local (wp_content) au répertoire de contenu de WordPress. Cela vous permet de modifier directement les thèmes et les plugins depuis votre machine hôte.
depends_on : Cela indique à Compose de démarrer le service db avant de démarrer le service wordpress. C’est important, car WordPress échouera s’il ne trouve pas sa base de données au démarrage.volumes (niveau supérieur) : Ce bloc définit les volumes nommés. db_data : crée un volume géré par Docker, ce qui est la manière recommandée de gérer les données persistantes.Maintenant, lancez cette application multi-services :
docker compose up -dCompose téléchargera à la fois les images mysql et wordpress, puis créera les conteneurs, en démarrant d'abord le service db.
Creating network "compose-demo_default" with the default driver
Creating volume "compose-demo_db_data" with default driver
Pulling db (mysql:8.0)...
...
Pulling wordpress (wordpress:latest)...
...
Creating mysql_db ... done
Creating wordpress_app ... doneVous pouvez maintenant accéder à votre nouveau site WordPress en naviguant vers localhost:8001 ou <^votre_domaine_ou_IP_serveur<^>:8001 dans votre navigateur. Vous devriez voir l'écran d'installation de WordPress. Pour un exemple plus détaillé, consultez notre article sur Comment installer WordPress avec Docker Compose.
Étape 6 — Utiliser Docker Compose pour le développement IA/ML
Au-delà des applications web, Docker Compose est un outil extrêmement utile pour créer des environnements de science des données et d'apprentissage automatique (AI/ML) reproductibles. Les projets AI/ML sont connus pour leurs dépendances complexes, incluant des versions spécifiques de Python, des bibliothèques comme TensorFlow ou PyTorch, et des pilotes au niveau du système comme le NVIDIA CUDA Toolkit. Docker Compose capture l'intégralité de cet environnement dans des fichiers de configuration, résolvant ainsi le problème du « ça fonctionne sur ma machine », ce qui est crucial pour la recherche reproductible.
Dans cet exemple, vous allez créer un environnement AI/ML multi-services comprenant :
- JupyterLab : Un conteneur pour le développement interactif, construit à partir d’un
Dockerfilepersonnalisé. - PostgreSQL : Un conteneur de base de données pour stocker les résultats des expériences et les métadonnées.
- Accès au GPU : Le conteneur JupyterLab sera configuré pour accéder au GPU NVIDIA de la machine hôte, une exigence courante pour l'entraînement de modèles.
Prérequis : Cet exemple nécessite une carte GPU NVIDIA sur votre machine hôte ainsi que l'installation du NVIDIA Container Toolkit. Sans cela, le conteneur ne pourra pas démarrer lors de la demande de ressources GPU.
Structure des fichiers
Tout d'abord, créez un répertoire pour votre projet. À l'intérieur, vous allez créer un fichier docker-compose.yml, un répertoire jupyter, un Dockerfile pour Jupyter, et un fichier requirements.txt. La structure devrait ressembler à ceci :
ai-project/
├── docker-compose.yml
└── jupyter/
├── Dockerfile
└── requirements.txtCréation des fichiers du composant
1. Le fichier requirements.txt
Ce fichier répertorie les packages Python pour votre environnement de science des données.
nano jupyter/requirements.txtAjoutez vos packages requis. Pour cet exemple, nous inclurons des bibliothèques pour la manipulation des données, la connexion à une base de données et un framework d'apprentissage profond.
pandas
scikit-learn
tensorflow
jupyterlab
psycopg2-binaryEnregistrez et fermez le fichier.
2. Le Dockerfile
Ce fichier définit votre service JupyterLab personnalisé. Il utilise une image officielle de Jupyter comme base et installe les packages à partir de requirements.txt.
nano jupyter/DockerfileCollez le contenu suivant :
# Start from a base image that includes Jupyter and scientific libraries
FROM jupyter/scipy-notebook:latest
# Copy our local requirements file into the container
COPY requirements.txt /tmp/requirements.txt
# Install the Python packages
RUN pip install --no-cache-dir -r /tmp/requirements.txtCe fichier indique à Docker d'utiliser jupyter/scipy-notebook comme point de départ, de copier votre requirements.txt dans le conteneur, puis d'utiliser pip pour installer les packages.
Définir l'environnement avec docker-compose.yml
Maintenant, créez le fichier principal docker-compose.yml. Ce fichier orchestrera à la fois le service db et votre service personnalisé jupyter.
nano docker-compose.ymlCollez la configuration suivante en remplaçant les espaces réservés <^...^> par vos propres identifiants sécurisés.
services:
db:
image: postgres:15-alpine
container_name: ai_postgres_db
environment:
POSTGRES_USER: <^your_db_user^>
POSTGRES_PASSWORD: <^your_db_pass^>
POSTGRES_DB: experiments
healthcheck:
test: ["CMD-SHELL", "pg_isready -U <^your_db_user^> -d experiments"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
networks:
- ai_net
jupyter:
build: ./jupyter
container_name: ai_jupyter_lab
ports:
- "8888:8888"
volumes:
- ./notebooks:/home/jovyan/work
environment:
- POSTGRES_HOST=db
- POSTGRES_USER=<^your_db_user^>
- POSTGRES_PASSWORD=<^your_db_pass^>
- POSTGRES_DB=experiments
restart: unless-stopped
networks:
- ai_net
depends_on:
db:
condition: service_healthy
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
volumes:
postgres_data:
name: ai_project_data
networks:
ai_net:
driver: bridgeCe fichier de configuration présente plusieurs concepts importants :
build: ./jupyter: Cela indique à Docker Compose de construire une image personnalisée pour le servicejupyter. Il recherche unDockerfiledans le répertoire spécifié./jupyter.volumes: - ./notebooks:/home/jovyan/work: Cela monte un répertoire local nomménotebooksdans le conteneur. Cela garantit que tous les notebooks Jupyter que vous créez sont enregistrés directement sur votre machine hôte, les conservant même après la suppression du conteneur.healthcheck: Comme indiqué dans la section de dépannage, cette vérification valide que le servicedbn'est pas seulement en cours d'exécution, mais prêt à accepter des connexions avant que les autres services ne démarrent.depends_on: ... condition: service_healthy: Cela indique au servicejupyterd'attendre que le contrôle d'état (healthcheck) du servicedbsoit réussi avant de démarrer.deploy.resources.reservations.devices: C'est le bloc qui demande l'accès au GPU.driver : nvidia: Spécifie le pilote hôte à utiliser.
count: 1: Demande un GPU.capabilities: [gpu]: Assure que le conteneur dispose des capacités nécessaires pour utiliser le GPU.
Exploitation de l'environnement IA/ML
Avec vos fichiers en place, vous êtes prêt à construire et à exécuter les services.
Depuis votre répertoire
ai-project, exécutez la commandedocker compose up. Vous devez ajouter l'option--buildla première fois pour indiquer à Compose de construire votre image personnaliséejupyter.docker compose up -d --buildCompose construira d'abord l'image
jupyter(ce qui peut prendre quelques minutes le temps de télécharger TensorFlow), puis téléchargera l'imagepostgres, et enfin lancera les deux conteneurs.[+] Building 5.8s (9/9) FINISHED => [internal] load build definition from Dockerfile ... [+] Running 3/3 ✔ Network ai-project_ai_net Created ✔ Container ai_postgres_db Started ✔ Container ai_jupyter_lab StartedVous pouvez maintenant accéder à l'interface JupyterLab en naviguant vers
http://localhost:8888(ou<^votre_ip_serveur^>:8888) dans votre navigateur. Il vous sera demandé un jeton, que vous pouvez obtenir à partir des journaux du conteneur :docker compose logs jupyterCherchez une ligne similaire à
http://127.0.0.1:8888/lab?token=a1b2c3d4e5f6...À l'intérieur d'un notebook Jupyter, vous pouvez maintenant vous connecter à votre base de données en utilisant le nom d'hôte
dbet les identifiants que vous avez fournis. Votre environnement a également accès au GPU de l'hôte pour l'entraînement du modèle.
Mise à l'échelle des services et utilisation de réseaux personnalisés
Docker Compose comprend des fonctionnalités pour la mise à l'échelle des services et la gestion des réseaux sur lesquels ils communiquent.
Mise à l'échelle du service avec des réplicas
Imaginez que votre serveur web Nginx de l'étape 2 reçoit trop de trafic. Vous pouvez mettre à l'échelle le service web pour exécuter plusieurs instances de conteneurs. Docker Compose peut gérer cela automatiquement.
Il existe deux principales façons de faire évoluer un service.
1. Utilisation de la clé replicas (Préféré en v2)
Vous pouvez définir le nombre souhaité d'instances directement dans votre fichier docker-compose.yml en utilisant les clés deploy et replicas. Cette fonctionnalité faisait à l'origine partie de Docker Swarm, mais elle est désormais disponible pour les déploiements Compose standard.
Modifiez votre docker-compose.yml de Nginx à partir de l'Étape 2 :
services:
web:
image: nginx:alpine
ports:
- "8000:80"
volumes:
- ./app:/usr/share/nginx/html
deploy:
replicas: 3Lorsque vous exécutez docker compose up -d, Compose créera trois conteneurs web. Cependant, vous rencontrerez un problème : les trois tenteront de se lier au port hôte 8000. Cela provoquera une erreur « le port est déjà attribué » pour le deuxième et le troisième conteneur. Pour résoudre ce problème dans une configuration de production, vous devriez supprimer le mappage ports du service web. De cette manière, les conteneurs web ne sont accessibles que depuis le réseau Docker. Un service séparé de répartition de charge serait le seul à disposer d’un port public. Il distribuerait ensuite le trafic vers les trois répliques web.
Un exemple de configuration ressemblerait à ceci (c'est un exemple avancé) :
services:
web:
image: nginx:alpine
# No 'ports' mapping here.
# The service is only accessible inside the 'web-net' network.
volumes:
- ./app:/usr/share/nginx/html
deploy:
replicas: 3
networks:
- web-net
load_balancer:
image: nginx:latest
ports:
- "80:80" # The load_balancer is the only service with a public port.
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # A config file that load balances to 'web'.
networks:
- web-net
depends_on:
- web
networks:
web-net:Dans cette configuration, le load_balancer écoute sur le port 80 et redirige les requêtes vers web_1, web_2 et web_3 en interne.
Cette clé replicas est surtout utile lorsqu'elle est utilisée avec un reverse proxy (comme Traefik ou une autre instance Nginx) qui peut équilibrer la charge des requêtes entre les répliques au sein du réseau Docker, sans que chaque réplique ait besoin d'exposer un port sur l'hôte.
2. Utilisation de l’option --scale
Une méthode courante pour le scaling est le paramètre --scale, hérité de Compose v1. Ce paramètre est appliqué au moment de l'exécution et remplace toute clé replicas.
Cependant, vous devez faire attention aux définitions de ports. Si votre service définit un mappage de port hôte fixe (par exemple, "8000:80"), exécuter docker compose up --scale provoquera une erreur pour le deuxième et le troisième conteneur, car ils tenteront tous de se lier au même port hôte.
Pour utiliser --scale pour des services qui exposent des ports, vous ne devez pas utiliser de mappage de port fixe sur l'hôte.
Option 1 : Mapper sur des ports hôtes aléatoires (idéal pour le développement)
Vous pouvez modifier votre
docker-compose.ymlpour spécifier uniquement le port du conteneur. Cela indique à Docker de mapper le port 80 de chaque conteneur sur un port aléatoire disponible sur votre machine hôte.services: web: image: nginx:alpine ports: - "80" # No fixed host port volumes: - ./app:/usr/share/nginx/htmlMaintenant, lorsque vous exécutez la commande scale :
docker compose up -d --scale web=3Exécutez
docker compose pspour voir le résultat. Chaque conteneur fonctionnera sur un port hôte différent, attribué aléatoirement :Name Command State Ports ---------------------------------------------------------------------------------- compose-demo_web_1 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49154->80/tcp compose-demo-web_2 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49155->80/tcp compose-demo-web_3 /docker-entrypoint.sh ngin ... Up 0.0.0.0:49156->80/tcpOption 2 : Utiliser un proxy inverse (idéal pour la production)
L'autre solution, comme mentionné dans la section
replicas, est de supprimer complètement la directiveportsdu serviceweb. Vous utiliseriez alors un conteneur de répartition de charge séparé (qui possède le seul port public) pour gérer et distribuer le trafic vers les répliques mises à l'échelle à l'intérieur du réseau Docker.Pour arrêter et supprimer les trois conteneurs, la commande reste la même :
docker compose down
docker-compose.yml - Correct pour --scale
Configuration réseau personnalisée
Par défaut, Docker Compose crée un seul réseau bridge pour votre application. Chaque service du fichier y est attaché, ce qui explique comment le conteneur wordpress a pu trouver le conteneur db simplement en utilisant le nom de son service (db).
Cependant, vous pouvez définir vos propres réseaux personnalisés pour une meilleure isolation et un meilleur contrôle.
Modifions l'exemple WordPress pour utiliser un réseau bridge personnalisé.
services:
db:
image: mysql:8.0
...
networks:
- app_net
wordpress:
image: wordpress:latest
...
ports:
- "8001:80"
depends_on:
- db
networks:
- app_net
volumes:
db_data:
networks:
app_net:
driver: bridgeVoici ce que nous avons ajouté :
réseaux(niveau supérieur) : Cela définit un nouveau réseau nomméapp_netet précise qu'il doit utiliser le pilote standardbridge.réseaux(niveau service) : Sousdbetwordpress, cette clé les relie à notre réseauapp_net.
Si vous aviez un troisième service (comme un outil d'analyse) que vous n'aviez pas attaché à app_net, il serait complètement isolé et incapable de communiquer avec les conteneurs db ou wordpress.
Pour le clustering multi-hôtes avec Docker Swarm, vous devez changer le driver de bridge à overlay. Le driver bridge est destiné à la communication entre les conteneurs sur un seul hôte, ce qui est la norme pour la plupart des cas d'utilisation de Docker Compose.
Utilisation de fichiers de configuration modulaires
À mesure que vos applications se développent, votre fichier docker-compose.yml peut devenir volumineux et difficile à gérer. Docker Compose prend en charge la directive include, vous permettant de répartir votre configuration sur plusieurs fichiers.
Imaginez que vous souhaitez séparer vos définitions WordPress et base de données, et peut-être avoir un docker-compose.override.yml commun pour les paramètres spécifiques au développement (comme lier un port sur la base de données).
La structure de votre répertoire pourrait ressembler à ceci :
compose-demo/
├── docker-compose.yml
├── docker-compose.db.yml
├── docker-compose.web.ymlCe fichier définira uniquement le service db.
services:
db:
image: mysql:8.0
container_name: mysql_db
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: <^your_root_password_here<^>
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: <^your_wordpress_password_here<^>
restart: unless-stopped
volumes:
db_data:Ce fichier définira uniquement le service wordpress.
services:
wordpress:
image: wordpress:latest
container_name: wordpress_app
ports:
- "8001:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: <^your_wordpress_password_here<^>
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wp_content:/var/www/html/wp-content
depends_on:
- db
restart: unless-stoppedMaintenant, votre fichier principal docker-compose.yml devient très simple. Il utilise simplement include pour intégrer les autres fichiers.
include:
- docker-compose.db.yml
- docker-compose.web.ymlLorsque vous exécutez docker compose up -d, Compose lira les trois fichiers, fusionnera les configurations et démarrera les services db et wordpress exactement comme s'ils étaient définis dans un seul fichier. Cette approche rend votre configuration beaucoup plus modulaire et réutilisable.
Remarque : La directive include : nécessite Docker Compose v2.20 ou une version ultérieure. Si votre système utilise une version plus ancienne, vous pouvez combiner les fichiers en utilisant docker compose -f docker-compose.db.yml -f docker-compose.web.yml up.
Migration de docker-compose (v1) vers docker compose (v2)
La commande docker compose que vous avez installée à l'étape 1 est « Compose v2 ». C'est un plugin basé sur Go intégré directement dans l'interface en ligne de commande Docker.
La version originale, « Compose v1 », était un outil Python distinct lancé avec docker-compose (avec un trait d'union). Depuis juillet 2023, Compose v1 n’est plus pris en charge et a été déprécié.
Principales modifications et compatibilité avec les versions précédentes
- La commande : Le changement le plus évident concerne la commande. Le trait d'union (
docker-compose) est désormais remplacé par un espace (docker compose). - Installation : la version v1 a été installée avec
pip. La version v2 est incluse avec Docker Desktop ou installée en tant que plugin CLI, comme vous l'avez fait à l'Étape 1. - Fichiers YAML : Vos fichiers
docker-compose.ymlsont presque 100 % compatibles avec les versions précédentes. Compose v2 prend entièrement en charge les versions de fichiers3.x. Vous n'avez pas besoin de modifier vos fichiers YAML pour la migration, seulement vos commandes. --project-nameoption : L'option-pfonctionne toujours, mais l'option complète est maintenant--project-nameau lieu de--project_name.
Guide de migration des commandes
La plupart des commandes sont identiques, juste sans le trait d'union. Voici un tableau comparant les commandes courantes de la version 1 avec leurs équivalents de la version 2.
Commande docker-compose (v1) | Commande docker compose (v2) | Notes |
|---|---|---|
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | Aucun changement dans la syntaxe. |
| | run crée un nouveau conteneur. exec s'exécute dans un conteneur existant. |
| | Le drapeau --scale est toujours pris en charge dans la v2. |
Comme vous pouvez le voir, pour la plupart des utilisations quotidiennes, le seul changement est docker-compose -> docker compose. Si vous utilisez des scripts, vous pouvez les mettre à jour simplement en supprimant le trait d'union.
Si vous avez encore l'ancien docker-compose v1 installé, vous pouvez le supprimer pour éviter toute confusion :
sudo pip3 uninstall docker-composeOu, si cela a été installé avec apt :
sudo apt remove docker-composeRésolution des problèmes courants de Docker Compose
Lorsque vous travaillez avec Docker Compose, vous pouvez rencontrer des problèmes liés à la syntaxe des fichiers, aux permissions ou aux conflits d'exécution des conteneurs. La plupart des problèmes peuvent être diagnostiqués et résolus en vérifiant méthodiquement votre configuration, vos permissions et les journaux des conteneurs.
Examinons certaines des erreurs les plus courantes et leurs solutions.
Permission refusée (Socket Docker)
C'est l'une des erreurs les plus courantes chez les nouveaux utilisateurs de Docker. Vous exécutez docker compose up et voyez un message d'erreur concernant le socket du démon Docker.
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sockProblème : Votre utilisateur non-root n'a pas la permission de communiquer avec le démon Docker, qui s'exécute en tant que
root.Solution : Vous devez ajouter votre utilisateur au groupe
docker, qui a été créé lors de l’installation de Docker.Ajoutez votre utilisateur au groupe
docker:sudo usermod -aG docker ${USER}
Pour que la nouvelle adhésion au groupe prenne effet, vous devez vous déconnecter et vous reconnecter.
Sinon, vous pouvez activer les modifications de groupe pour votre session de terminal actuelle en tapant :
newgrp docker
Cela devrait résoudre toutes les erreurs d'autorisation liées au socket Docker.
Erreurs de syntaxe et d'indentation YAML
Docker Compose ne parvient pas à s'exécuter et indique que votre fichier docker-compose.yml est invalide.
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.web.ports contains an invalid type, it should be a listOr :
mapping values are not allowed in this context at line 5- Problème : Le fichier
docker-compose.ymldépend d'une syntaxe YAML stricte. L'erreur la plus courante est une indentation incorrecte. YAML utilise des espaces, pas des tabulations, pour définir la structure. Solution : Vérifiez attentivement l'indentation de votre fichier
docker-compose.yml.- La norme est deux espaces pour chaque niveau d'indentation.
- Assurez-vous que toutes les clés au même niveau (comme
version,services,volumes) commencent à la même colonne. - Assurez-vous que toutes les sous-clés (comme
image,ports,volumessous un service) sont indentées de deux espaces de plus que leur service parent (par exemple,web). - Utilisez un éditeur de code avec un linter YAML pour mettre automatiquement en évidence les erreurs de syntaxe.
Conflits portuaires
Vous essayez de démarrer votre environnement, mais la commande échoue avec un message d'erreur indiquant que l'adresse est déjà utilisée.
Error starting userland proxy: listen tcp 0.0.0.0:8000: bind: address already in useProblème : Un autre processus sur votre machine hôte écoute déjà sur le port que vous essayez de mapper (dans ce cas, le port
8000). Il s'agit souvent d'un autre conteneur Docker ou d'un serveur de développement local.Solution : Vous avez deux options :
Arrêtez l'autre processus. Vous pouvez trouver le processus utilisant le port avec cette commande :
sudo lsof -i :8000S'il s'agit d'un autre conteneur Docker, arrêtez-le avec
docker stop <container_id>.
Changez le port hôte dans votre fichier
docker-compose.yml. C'est souvent la solution la plus simple. Modifiez le mappageportsde"8000:80"à un autre port, comme"8001:80".... ports: - "8001:80" # Changed from 8000 ...
docker-compose.yml
Le service échoue avec Connexion refusée (depends_on)
Dans une application multi-service (comme l'exemple WordPress et MySQL), le conteneur wordpress démarre mais ses journaux affichent Connexion refusée ou Le serveur MySQL a disparu lorsqu'il essaie de se connecter au service db.
Problème : Vous avez utilisé
depends_on, mais cette directive ne fait que attendre que le conteneurdbdémarre. Elle ne garantit pas que l'application MySQL à l'intérieur du conteneur soit entièrement initialisée et prête à accepter des connexions.Solution : L'application (dans ce cas, WordPress) doit être configurée pour réessayer sa connexion. La plupart des images modernes ont cette logique de réessai intégrée. Pour les images qui ne l'ont pas, vous devez mettre en place un contrôle de santé.
Vous pouvez ajouter un
healthcheckà votre servicedb. Ledepends_ondu servicewordpresspeut alors être configuré pour attendre que la base de données soit « healthy », et pas seulement « started ».
Exemple de vérification de santé pour MySQL :
services:
db:
image: mysql:8.0
...
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p<^your_root_password_here<^>"]
interval: 10s
timeout: 5s
retries: 5
wordpress:
image: wordpress:latest
...
depends_on:
db:
condition: service_healthy # This now waits for the healthcheck
...Erreurs avec les volumes et les montages de liaison
Vous pouvez rencontrer des erreurs d'autorisation dans les journaux de votre conteneur, ou constater que le répertoire de données de votre conteneur est vide.
Permissions des fichiers/dossiers
Problème : Le conteneur s’exécute en tant qu’utilisateur spécifique (par exemple,
www-dataavec l’ID utilisateur 33), mais le répertoire hôte que vous avez monté appartient à votre utilisateur (par exemple,ubuntuavec l’ID utilisateur 1000). L’utilisateur du conteneur n’a pas la permission d’écrire dans le répertoire hôte.Solution : Changez la propriété du répertoire hôte pour qu'elle corresponde à l'ID utilisateur à l'intérieur du conteneur. Vous pouvez trouver l'ID utilisateur du conteneur en exécutant
docker compose exec <service_name> id. Par exemple, si l'ID est 33 (commun pourwww-data) :sudo chown -R 33:33 ./wp_content
Problèmes de chemin relatif
Problème : Votre
docker-compose.ymlutilise un chemin relatif comme./app, mais votre fichierindex.htmln'est pas servi.Solution : Docker Compose interprète les chemins relatifs à partir du répertoire où vous exécutez la commande
docker compose up. Exécutez toujours les commandes Compose depuis le même répertoire qui contient votre fichierdocker-compose.yml.
Réseautage et découverte de services
Les journaux de votre conteneur d'application affichent Hôte non trouvé ou Impossible de résoudre l'hôte : db.
- Problème : Votre conteneur
wordpressne parvient pas à trouver le conteneurdbsur le réseau. Solution : Par défaut, Docker Compose crée un réseau et y connecte tous les services. Les services peuvent se trouver les uns les autres en utilisant leurs noms de service.
Vérifiez les noms de services : Assurez-vous que le nom d'hôte dans la configuration de votre application (par exemple, la variable d'environnement
WORDPRESS_DB_HOST) est exactement le même que le nom du service dans votredocker-compose.yml(par exemple,db).
Inspecter le réseau : Utilisez
docker compose pspour trouver le nom de votre projet (par exemple,compose-demo). Ensuite, inspectez le réseau par défaut :docker network inspect compose-demo_defaultLa sortie JSON listera tous les conteneurs connectés à ce réseau. Si l'un de vos services est manquant, vérifiez votre
docker-compose.ymlpour toute configuration personnalisée denetworksqui pourrait l'isoler.
Incompatibilité de commande (v1 contre v2)
Vous tapez docker-compose up (avec un trait d'union) et voyez une erreur « commande introuvable ».
docker-compose: command not found- Problème : Vous essayez d'utiliser la commande pour Compose v1, qui est un outil Python obsolète. Ce guide installe Compose v2, qui est un plugin intégré directement dans le CLI Docker.
- Solution : Utilisez la commande correcte en remplaçant le trait d'union (
-) par un espace.
docker-compose (v1) | docker compose (v2) |
|---|---|
docker-compose up | docker compose up |
docker-compose down | docker compose down |
docker-compose ps | docker compose ps |
docker-compose logs | docker compose logs |
Utilisez toujours docker compose (avec un espace) lorsque vous suivez ce guide.
FAQ
1. À quoi sert Docker Compose ?
Docker Compose est un outil pour définir et exécuter des applications Docker multi-conteneurs.
Il utilise un seul fichier YAML (par défaut, docker-compose.yml) pour configurer tous les composants de votre application, appelés services. Ce fichier définit également les réseaux qui permettent aux services de communiquer entre eux ainsi que les volumes utilisés pour les données persistantes.
Avec ce seul fichier, vous pouvez gérer l'ensemble de votre pile d'applications avec des commandes simples :
docker compose updémarre et exécute l'ensemble de votre application, y compris tous les conteneurs, réseaux et volumes spécifiés.docker compose downarrête et supprime tous les conteneurs, réseaux et volumes créés par votre application.
Il est particulièrement utile pour gérer des applications nécessitant plusieurs composants, comme un site web qui a besoin d'un serveur web (comme Nginx), d'un backend d'application (comme WordPress) et d'une base de données (comme MySQL).
2. Comment installer Docker Compose sur Ubuntu ?
La méthode recommandée consiste à installer Docker Compose en tant que plugin pour l’interface en ligne de commande Docker. Cela se fait en installant le paquet docker-compose-plugin depuis le dépôt apt officiel de Docker.
Tout d'abord, assurez-vous d'avoir suivi la documentation officielle de Docker pour configurer le dépôt
aptde Docker sur votre système Ubuntu.Mettez à jour la liste de vos paquets :
sudo apt updateInstallez le plugin Docker Compose :
sudo apt install docker-compose-pluginVérifiez l'installation en vérifiant la version. La commande utilise un espace, pas un trait d'union.
docker compose version
3. Comment puis-je mettre à jour Docker Compose vers la dernière version ?
Parce que Docker Compose (v2) est installé comme un paquet système via apt, vous pouvez le mettre à jour en utilisant le processus standard de mise à jour des logiciels d'Ubuntu.
Actualisez l'index de vos paquets locaux :
sudo apt updateExécutez une mise à jour du système complète, qui inclura le plugin Compose :
sudo apt upgradeSinon, si vous voulez seulement mettre à jour le plugin lui-même, vous pouvez exécuter :
sudo apt install --only-upgrade docker-compose-plugin
4. Docker Compose peut-il être utilisé dans des environnements de production ?
Oui, Docker Compose est fréquemment utilisé en production, en particulier pour les applications qui s'exécutent sur un hôte unique.
Il offre un moyen simple de définir, déployer et gérer le cycle de vie des services, réseaux et volumes de votre application. Pour un déploiement sur un seul serveur, c'est une solution très efficace et facile à gérer.
Pour des scénarios plus complexes nécessitant la coordination de conteneurs sur plusieurs hôtes (un cluster), d'autres outils sont plus couramment utilisés. Parmi eux, le Docker Swarm (qui utilise une syntaxe de fichier Compose similaire) et Kubernetes (qui est la norme de l'industrie pour l'orchestration de conteneurs à grande échelle).
5. Quelle est la différence entre Docker et Docker Compose ?
Ce tableau présente les principales différences entre l'interface en ligne de commande Docker et l'interface en ligne de commande Docker Compose.
| Fonctionnalité | docker (Moteur Docker) | docker compose (Plugin Compose) |
|---|---|---|
| Portée | Gère les objets Docker individuels. | Gère une application complète à plusieurs conteneurs comme une seule unité. |
| Usage principal | Création d’images (docker build), exécution de conteneurs uniques (docker run), gestion des conteneurs (docker ps), des images, des volumes et des réseaux. | Orchestrer plusieurs services définis dans un fichier docker-compose.yml. |
| Commandes | Commandes de bas niveau concentrées sur un seul objet. Exemple : docker run -d -p 80:80 -v ./:/app nginx | Commandes de haut niveau pour l'ensemble de l'application. Exemple : docker compose up |
| Analogie | Un élément de construction (un conteneur unique). | Le plan et le responsable de la construction de l'ensemble du bâtiment (la demande). |
En résumé, vous utilisez docker pour interagir avec un seul conteneur. Vous utilisez docker compose pour gérer l'ensemble de votre pile d'applications (par exemple, web, app, db) en une seule fois.
6. Comment exécuter plusieurs conteneurs avec Docker Compose ?
Vous exécutez plusieurs conteneurs en les définissant comme des services dans votre fichier docker-compose.yml.
Créez un fichier nommé
docker-compose.yml.Dans ce fichier, utilisez la clé
services :pour définir chaque conteneur que vous souhaitez exécuter.Voici un exemple pratique qui définit et exécute deux conteneurs : un site WordPress et une base de données MySQL.
services: db: # This is the first service (container) image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: <^your_password_here<^> MYSQL_DATABASE: wordpress volumes: - db_data:/var/lib/mysql wordpress: # This is the second service (container) image: wordpress:latest ports: - "8001:80" environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_PASSWORD: <^your_password_here<^> depends_on: - db volumes: db_data:Enregistrez le fichier et ouvrez un terminal dans le même répertoire.
Exécutez une seule commande pour démarrer les deux conteneurs :
docker compose up -d
docker-compose.yml
Docker Compose lira le fichier, créera un réseau partagé pour les services, téléchargera les images mysql et wordpress, et démarrera un conteneur pour chaque service.
7. Pourquoi utiliser Docker Compose pour le développement ?
Docker Compose est un outil standard pour les environnements de développement car il résout plusieurs problèmes courants.
Environnements cohérents : Il assure que chaque développeur d'une équipe utilise exactement les mêmes services (base de données, cache, serveur web) avec les mêmes versions et configurations. Cela est défini dans le fichier
docker-compose.yml, qui est ajouté au contrôle de version. Cela élimine le problème du « ça marche sur ma machine ».Simplicité : Il remplace les scripts d'installation complexes et les longues commandes
docker run. Un développeur n'a besoin que d'exécuterdocker compose uppour démarrer l'ensemble de la pile d'applications etdocker compose downpour l'arrêter.Isolation des services : Les développeurs peuvent travailler sur plusieurs projets sur la même machine sans conflits de dépendances. Le projet A peut utiliser PostgreSQL 9.6 et le projet B peut utiliser PostgreSQL 14, chaque base de données fonctionnant dans un conteneur isolé géré par son propre fichier Compose.
Tests d'intégration faciles : Parce que Compose démarre toutes les dépendances d'une application en même temps, il crée un environnement local idéal pour exécuter des tests d'intégration qui vérifient comment les services interagissent entre eux.
Conclusion
Dans ce guide, vous avez installé Docker Compose et configuré une application complète à plusieurs conteneurs. Vous avez commencé avec un fichier de base docker-compose.yml pour un serveur web Nginx et avez progressé vers une pile plus complexe et réaliste impliquant une application WordPress et une base de données MySQL. Vous avez appris à gérer l'ensemble du cycle de vie de l'application, de la création et l'exécution des services à leur arrêt et suppression.
Vous êtes maintenant familiarisé avec les concepts clés pour gérer efficacement les applications, y compris la mise à l'échelle des services, les définitions de réseau personnalisées et la division de votre configuration en fichiers modulaires à l'aide de la directive include. En suivant le guide de migration et les étapes de dépannage, vous pouvez également résoudre des problèmes courants tels que les conflits de ports, les erreurs « Permission refusée » et les erreurs de syntaxe YAML. Les compétences abordées ici vous permettront de créer des environnements de développement cohérents et reproductibles et de déployer des applications sur un seul hôte en toute confiance.
Pour une référence complète de toutes les commandes docker compose disponibles, consultez la documentation officielle.
Pour plus de tutoriels liés à Docker, consultez les articles suivants :
- Comment installer Docker sur Ubuntu – Guide étape par étape
- Comment installer WordPress avec Docker Compose
Merci d'apprendre avec la communauté Linux-Console.net.

