Comment utiliser la commande docker compose up pour gérer des conteneurs

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce lab, vous apprendrez à gérer efficacement des conteneurs en utilisant la commande docker compose up. Nous aborderons l'utilisation fondamentale de docker compose up pour démarrer les services définis dans un fichier docker-compose.yml, y compris l'exécution des services en premier plan et en mode détaché.

De plus, vous explorerez les options avancées de docker compose up, telles que le forçage de la recréation des conteneurs avec force-recreate, la prévention des recréations inutiles avec no-recreate, et la construction automatique des images avant le démarrage des conteneurs. À la fin de ce lab, vous serez compétent dans l'utilisation de docker compose up pour divers scénarios de gestion de conteneurs.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555096{{"Comment utiliser la commande docker compose up pour gérer des conteneurs"}} docker/ps -.-> lab-555096{{"Comment utiliser la commande docker compose up pour gérer des conteneurs"}} docker/stop -.-> lab-555096{{"Comment utiliser la commande docker compose up pour gérer des conteneurs"}} docker/rm -.-> lab-555096{{"Comment utiliser la commande docker compose up pour gérer des conteneurs"}} docker/build -.-> lab-555096{{"Comment utiliser la commande docker compose up pour gérer des conteneurs"}} end

Démarrer des services avec docker compose up

Dans cette étape, vous apprendrez comment démarrer les services définis dans un fichier docker-compose.yml en utilisant la commande docker compose up. Avant de commencer, nous devons installer Docker Compose car il n'est pas préinstallé dans cet environnement.

Tout d'abord, installons Docker Compose. Nous allons télécharger la dernière version stable et la rendre exécutable.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Maintenant que Docker Compose est installé, créons un simple fichier docker-compose.yml pour définir un service. Nous allons créer un fichier nommé docker-compose.yml dans votre répertoire ~/project.

nano ~/project/docker-compose.yml

Ajoutez le contenu suivant au fichier :

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

Ce fichier docker-compose.yml définit un seul service nommé web. Il utilise l'image nginx:latest et mappe le port 80 de l'hôte vers le port 80 du conteneur.

Maintenant, utilisons docker compose up pour démarrer le service. Naviguez vers le répertoire ~/project et exécutez la commande.

cd ~/project
docker compose up

Vous verrez une sortie indiquant que Docker Compose est en train de créer et démarrer le conteneur web. Par défaut, docker compose up s'exécute au premier plan, affichant les logs des services en cours d'exécution.

Pour vérifier que le conteneur Nginx fonctionne, vous pouvez ouvrir un nouveau terminal ou utiliser curl pour accéder au serveur web.

curl http://localhost

Vous devriez voir le code HTML de la page d'accueil par défaut de Nginx. Cela confirme que le service web fonctionne et est accessible.

Pour arrêter les services, appuyez sur Ctrl+C dans le terminal où docker compose up s'exécute. Cela arrêtera et supprimera les conteneurs.

Exécuter des services en mode détaché

Dans l'étape précédente, vous avez démarré les services avec docker compose up, qui s'exécutait au premier plan. Ce mode est utile pour le débogage, mais pour exécuter des services en production ou en arrière-plan, vous devrez utiliser le mode détaché.

Le mode détaché signifie que Docker Compose démarrera les conteneurs puis se terminera, laissant les conteneurs s'exécuter en arrière-plan. Cela vous permet de continuer à utiliser votre terminal pour d'autres tâches.

Pour exécuter les services en mode détaché, ajoutez simplement l'option -d à la commande docker compose up. Assurez-vous d'être dans le répertoire ~/project où se trouve votre fichier docker-compose.yml.

cd ~/project
docker compose up -d

Vous verrez une sortie indiquant que les conteneurs sont en cours de création et de démarrage, mais la commande vous ramènera à l'invite du terminal une fois les services démarrés.

Pour vérifier que le conteneur s'exécute en arrière-plan, utilisez la commande docker ps pour lister les conteneurs en cours d'exécution.

docker ps

Vous devriez voir une entrée pour le conteneur project-web-1 (le nom suit généralement le format [nom_répertoire]-[nom_service]-[numéro_instance]).

Vous pouvez toujours accéder au serveur web Nginx avec curl pour confirmer son fonctionnement.

curl http://localhost

Vous devriez à nouveau voir le code HTML de la page d'accueil par défaut de Nginx.

Pour arrêter les services démarrés en mode détaché, utilisez la commande docker compose down dans le même répertoire que votre fichier docker-compose.yml.

docker compose down

Cette commande arrêtera et supprimera les conteneurs, réseaux et volumes créés par docker compose up.

Recréer les conteneurs avec force-recreate

Dans l'étape précédente, vous avez appris à exécuter des services en mode détaché. Par défaut, lorsque vous relancez docker compose up avec le même fichier docker-compose.yml et que les conteneurs sont déjà en cours d'exécution, Docker Compose ne recréera pas les conteneurs sauf s'il y a des modifications dans la définition du service (comme l'image ou les ports).

Parfois, vous pourriez vouloir forcer Docker Compose à arrêter et recréer les conteneurs même s'il n'y a pas de modifications dans la définition du service. Cela peut être utile pour appliquer des mises à jour qui ne nécessitent pas de changer le fichier docker-compose.yml, ou simplement pour garantir un démarrage à neuf du conteneur.

Pour forcer la recréation des conteneurs, vous pouvez utiliser l'option --force-recreate avec la commande docker compose up.

D'abord, assurez-vous que votre service web est en cours d'exécution en mode détaché depuis l'étape précédente. Sinon, exécutez :

cd ~/project
docker compose up -d

Maintenant, relançons docker compose up avec l'option --force-recreate.

cd ~/project
docker compose up -d --force-recreate

Vous verrez une sortie indiquant que Docker Compose arrête puis recrée le conteneur web. Même si le fichier docker-compose.yml n'a pas changé, l'option --force-recreate indique à Docker Compose de supprimer le conteneur existant et d'en créer un nouveau basé sur la configuration actuelle.

Vous pouvez vérifier que le conteneur a été recréé en vérifiant son ID avec docker ps. L'ID du conteneur devrait être différent de celui que vous avez vu avant d'exécuter la commande avec --force-recreate.

docker ps

Notez l'ID du conteneur dans la sortie.

Pour nettoyer, arrêtez les services en cours d'exécution :

cd ~/project
docker compose down

Empêcher la recréation avec no-recreate

Dans l'étape précédente, vous avez appris à forcer la recréation des conteneurs en utilisant l'option --force-recreate. Examinons maintenant le scénario inverse : empêcher la recréation.

Comme mentionné précédemment, par défaut, docker compose up ne recréera pas les conteneurs s'ils sont déjà en cours d'exécution et que leur configuration dans le fichier docker-compose.yml n'a pas changé. Cependant, il peut y avoir des situations où vous souhaitez explicitement vous assurer que les conteneurs existants ne soient pas recréés, même s'il y a des modifications mineures qui pourraient normalement déclencher une recréation.

Pour empêcher la recréation des conteneurs, vous pouvez utiliser l'option --no-recreate avec la commande docker compose up.

D'abord, assurez-vous que votre service web est arrêté. S'il est en cours d'exécution, arrêtez-le avec :

cd ~/project
docker compose down

Maintenant, démarrons le service avec docker compose up -d.

cd ~/project
docker compose up -d

Vérifiez que le conteneur est en cours d'exécution :

docker ps

Notez l'ID du conteneur.

Maintenant, relançons docker compose up avec l'option --no-recreate.

cd ~/project
docker compose up -d --no-recreate

Vous verrez une sortie indiquant que le service est à jour et que le conteneur n'est pas recréé. Si vous vérifiez à nouveau avec docker ps, vous constaterez que l'ID du conteneur est identique à celui noté précédemment.

docker ps

Cela démontre que l'option --no-recreate a bien empêché Docker Compose de recréer le conteneur existant.

Pour nettoyer, arrêtez les services en cours d'exécution :

cd ~/project
docker compose down

Construire des images avant de démarrer les conteneurs

Dans les étapes précédentes, nous avons utilisé des images Docker pré-construites depuis Docker Hub (comme nginx:latest). Cependant, vous aurez souvent besoin de construire vos propres images Docker personnalisées pour vos applications.

Docker Compose peut automatiquement construire les images définies dans votre fichier docker-compose.yml avant de démarrer les services. Cela se fait généralement en spécifiant un contexte de build au lieu d'un nom d'image pour un service.

Modifions notre fichier docker-compose.yml pour construire une simple image Nginx personnalisée.

D'abord, créez un nouveau répertoire nommé nginx_custom dans ~/project.

cd ~/project
mkdir nginx_custom

Maintenant, créez un Dockerfile dans le répertoire nginx_custom.

nano ~/project/nginx_custom/Dockerfile

Ajoutez le contenu suivant au Dockerfile :

FROM nginx:latest
RUN echo '<h1>Hello from Custom Nginx!</h1>' >/usr/share/nginx/html/index.html

Ce Dockerfile part de l'image officielle nginx:latest puis remplace le fichier index.html par défaut par un contenu personnalisé.

Ensuite, modifiez votre fichier ~/project/docker-compose.yml pour utiliser ce Dockerfile afin de construire l'image du service web. Ouvrez le fichier pour l'éditer :

nano ~/project/docker-compose.yml

Modifiez la définition du service web pour utiliser build au lieu de image :

version: "3.8"
services:
  web:
    build: ./nginx_custom
    ports:
      - "80:80"

Maintenant, lorsque vous exécuterez docker compose up, Docker Compose construira d'abord l'image définie par le Dockerfile dans le répertoire ./nginx_custom puis démarrera un conteneur utilisant cette nouvelle image.

Assurez-vous d'être dans le répertoire ~/project et exécutez :

cd ~/project
docker compose up -d

Vous verrez une sortie indiquant que Docker Compose construit l'image puis crée et démarre le conteneur.

Pour vérifier que la page Nginx personnalisée est servie, utilisez curl :

curl http://localhost

Vous devriez voir le résultat <h1>Hello from Custom Nginx!</h1>, confirmant que l'image a été construite et que le conteneur fonctionne avec le contenu personnalisé.

Pour nettoyer, arrêtez les services en cours d'exécution :

cd ~/project
docker compose down

Résumé

Dans ce lab, vous avez appris à utiliser la commande docker compose up pour gérer des conteneurs. Vous avez commencé par installer Docker Compose et créer un simple fichier docker-compose.yml pour définir un service web utilisant l'image Nginx. Vous avez ensuite utilisé docker compose up pour démarrer le service, en observant qu'il s'exécute en premier plan par défaut et affiche les logs des conteneurs. Vous avez vérifié le fonctionnement du service en accédant à la page d'accueil Nginx.

Le lab a également présenté l'exécution des services en mode détaché à l'aide du flag -d, permettant à la commande de se terminer tandis que les conteneurs continuent de s'exécuter en arrière-plan. Vous avez appris à forcer la recréation des conteneurs même si leur configuration n'a pas changé avec le flag --force-recreate, ainsi qu'à empêcher la recréation des conteneurs existants avec le flag --no-recreate. Enfin, vous avez exploré le flag --build pour construire ou reconstruire des images avant de démarrer les conteneurs, garantissant ainsi l'utilisation de la dernière version de l'image.