top of page

Introduction

Qu'est-ce que Docker Compose?

Docker Compose est un outil permettant de définir (dans un fichier YAML), d’exécuter et gérer (en ligne de commande) plusieurs conteneurs comme un ensemble de services inter-connectés. 

Il vous permet donc de créer un conteneur en tant que service, idéal pour votre environnement de développement, de test ou de transfert.

En plus détaillé, si votre application Docker inclut plusieurs conteneurs (par exemple, un serveur Web et une base de données s'exécutant dans des conteneurs distincts), la construction, l'exécution et la connexion des conteneurs à partir de fichiers Docker distincts sont fastidieuses et chronophages. Docker Compose résout cette problématique en vous permettant d'utiliser un fichier YAML pour définir des applications multi-conteneurs . Vous pouvez configurer autant de conteneurs que vous le souhaitez, comment ils doivent être construits et connectés et où les données doivent être stockées. Une fois le fichier YAML terminé, vous pouvez exécuter une seule commande pour créer, exécuter et configurer tous les conteneurs.

Compose est un script python, il peut être facilement installé avec la commande pip (pip est la commande permettant d’installer le logiciel Python à partir du référentiel de packages Python). 

Le guide suivant vous montrera comment le fichier docker-compose.yml est organisé et montre comment l'utiliser pour créer plusieurs configurations d'application de base.

Avant de commencer

Installer Docker

Vous aurez besoin de Docker installée pour suivre les étapes de ce guide.

Vous pouvez éventuellement supprimer une installation obsolète de Docker présente sur votre système avec :

sudo apt remove docker docker-engine docker.io

Voir la procédure d'installation de Docker CE ici. (si nécessaire)

Étape 1 - Installation de Docker Compose

1. Téléchargez la dernière version de Docker Compose. Vérifiez la page des versions et remplacez 1.23.2 dans la commande ci-dessous la version étiquetée en tant que dernière version:

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

2. Définir les autorisations de fichier:

sudo chmod +x /usr/local/bin/docker-compose

Étape 2 - Exécution d'un conteneur avec Docker Compose ( Débutant )

Le registre public Docker Hub, inclut une image que vous devez déjà connaitre, hello-world à des fins de démonstration et de test. Elle nous montre la configuration minimale requise pour exécuter un conteneur à l'aide de Docker Compose: un fichier YAML qui appelle une seule image:

Tout d'abord, nous allons créer un répertoire pour le fichier YAML et aller sa racine :

mkdir hello-world
cd hello-world

Lorsque nous utilisons docker-compose, nous avons besoin d'un fichier .yml nommé "docker-compose.yml".

Nous allons maintenant créer le fichier YAML nécessaire à l'initialisation de Docker Compose.

nano docker-compose.yml

Placez le contenu suivant dans le fichier, enregistrez-le et quittez l'éditeur de texte:

my-test:
 image: hello-world

  • La première ligne du fichier YAML est utilisée pour le nom du conteneur. 

  • La deuxième ligne spécifie quelle image utiliser pour créer le conteneur. Lorsque nous exécutons la commande, docker-compose up celle-ci recherchera une image locale à l'aide du nom spécifié hello-world.​​

docker-compose up

La première fois que nous exécutons la commande, s'il n'y a pas d'image locale nommée hello-world, Docker Compose l'extraira du référentiel public de Docker Hub comme déjà vu lors de l'utilisation de Docker.

Maintenant, tout en restant dans le répertoire /hello-world, nous allons exécuter la commande suivante:

Après avoir extrait l’image, docker-compose crée un conteneur, attache et exécute le programme hello-world, qui confirme à son tour que l’installation semble fonctionner:

. . .
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
. . .

Ensuite, il affiche une explication de ce qu’il a fait:

1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

Les conteneurs Docker restent exécutés tant que la commande est active. Ainsi, une fois l'exécution de hello-world terminée, le conteneur s'est arrêté. 

Par conséquent, lorsque nous examinons les processus actifs, les en-têtes de colonne apparaissent, mais le conteneur hello-world ne sera pas répertorié car il ne s'exécute pas.

docker ps

Nous pouvons voir les informations sur les conteneurs, dont nous aurons besoin à l'étape suivante, en utilisant le drapeau -a qui montre tous les conteneurs, pas seulement les actifs:

docker ps -a

CONTAINER ID       IMAGE          COMMAND    CREATED            STATUS                           PORTS    NAMES
06069fd5ca23       hello-world     "/hello"           3 minutes ago     Exited (0) 3 minutes ago                drunk_payne

Ceci affiche les informations dont vous aurez besoin dans certains cas pour interagir avec le conteneur.

Étape 3 - Dockeriser un environnement LEMP ( Avancé )

Dans ce tutoriel, nous allons voir pas à pas comment utiliser docker-compose pour créer un environnement LEMP (LEMP = Linux - Nginx - MySQL - PHP). Nous allons exécuter tous les composants dans différents conteneurs Docker, nous allons configurer un conteneur Nginx, un conteneur PHP, un conteneur PHPMyAdmin et un conteneur MySQL / MariaDB.

Créez un nouveau répertoire pour l'environnement du projet.

mkdir lemp-compose/

cd lemp-compose/

Ceci est notre environnement pour Docker Compose, tous les fichiers qui seront dans le conteneur Docker doivent être dans ce répertoire.

Dans le répertoire "lemp-compose", créez des nouveaux répertoires et un fichier docker-compose.yml:

touch docker-compose.yml

mkdir -p {logs,nginx,public,db-data}

  • logs : Répertoire des fichiers logs Nginx.

  • nginx : contient la configuration Nginx telle que l'hôte virtuel, etc.

  • public : répertoire des fichiers Web, index.html et du fichier d'informations PHP.

  • db-data : volume du répertoire des données MariaDB.

Créez les fichiers journaux error.log et access.log dans le répertoire "logs".

touch logs/{error,access}.log

Créez un nouveau fichier de configuration d'hôte virtuel nginx dans le répertoire "nginx" :

nano nginx/app.conf

Collez la configuration ci-dessous:

upstream php {
        server phpfpm:9000;
}
 
server {
 
        server_name 193.70.36.50;
 
        error_log "/opt/bitnami/nginx/logs/myapp-error.log";
        access_log  "/opt/bitnami/nginx/logs/myapp-access.log";
 
        root /myapps;
        index index.php index.html;
 
        location / {
 
                try_files $uri $uri/ /index.php?$args;
        }
 
        location ~ \.php$ {
 
                include fastcgi.conf;
                fastcgi_intercept_errors on;
                fastcgi_pass php;
        }
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Enregistrez le fichier et quittez nano.

Créez un nouveau fichier index.html et un fichier d’informations PHP dans le répertoire "public".

echo '<h1>LEMP Docker-Compose</h1><p><b>goankh-lab</b>' > public/index.html

echo '<?php phpinfo(); ?>' > public/info.php

Pour afficher l'arborescence nouvellement créée vous pouvez utilisez la commande très utile "tree".

sudo apt install tree

tree

Capture2.PNG

Configuration du fichier docker-compose.yml

Dans l'étape précédente, nous avons créé les répertoires et les fichiers nécessaires à nos conteneurs. Dans cette étape, nous allons éditer le fichier "docker-compose.yml". Dans le fichier docker-compose.yml, nous définirons nos services pour LEMP, les images de base de chaque conteneur et les volumes de docker.

nano docker-compose.yml

- Définir le service Nginx

Collez la configuration nginx ci-dessous :

nginx:
    image: 'bitnami/nginx'
    ports:
        - '80:80'
    links:
        - phpfpm
    volumes:
        - ./logs/access.log:/opt/bitnami/nginx/logs/myapp-access.log
        - ./logs/error.log:/opt/bitnami/nginx/logs/myapp-error.log
        - ./nginx/app.conf:/bitnami/nginx/conf/vhosts/app.conf
        - ./public:/myapps

Dans cette configuration, nous avons déjà défini :

  • nginx : le nom du service.

  • image : nous utilisons une image de Docker "bitnami/nginx".

  • ports : exposer le port 80 du conteneur au port 80 de l'hôte.

  • links : relie le conteneur de services "nginx" au conteneur "phpfpm".

  • volumes : monte les répertoires locaux sur le conteneur. Monte le répertoire des fichiers journaux, la configuration de l'hôte virtuel Nginx et le répertoire racine Web.

- Définir le service PHP-fpm

Collez la configuration suivante juste en dessous celle de Nginx :

phpfpm:
    image: 'bitnami/php-fpm'
    ports:
        - '9000:9000'
    volumes:
        - ./public:/myapps

Nous avons défini ici:

  • phpfpm : le nom du service.

  • image : définit l'image de base du service phpfpm en utilisant "bitnami/php-fpm".

  • ports : nous utilisons PHP-fpm avec le port TCP 9000 et exposons le port 9000 à l'hôte.

  • volumes : monter le répertoire racine Web "public" vers "myapps" sur le conteneur.

- Définir le service MySQL

Ce troisième bloc définit le conteneur du service MariaDB, collez la configuration ci-dessous :

mysql:
    image: 'mariadb'
    ports:
        - '3306:3306'
    volumes:
        - ./db-data:/var/lib/mysql
    environment:
        - MYSQL_ROOT_PASSWORD=goankh-lab123

Ici vous pouvez voir que nous utilisons:

  • mysql : comme nom de service.

  • image : le conteneur est basé sur l'image Docker "mariadb".

  • ports : conteneur de service utilisant le port 3306 pour la connexion MySQL et l'exposant à l'hôte sur le port 3306.

  • volumes : répertoire db-data mysql

  • environnement : définit la variable d'environnement "MYSQL_ROOT_PASSWORD" qui sera mot de passe root de mysql.

- Configuration du service PHPMyAdmin

Pour le dernier bloc, utilisez la configuration ci-dessous :

phpmyadmin:
    image: 'phpmyadmin/phpmyadmin'
    restart: always
    ports:
       - '8080:80'
    links:
        - mysql:mysql
    environment:
        MYSQL_USERNAME: root
        MYSQL_ROOT_PASSWORD: goankh-lab123
        PMA_HOST: mysql

Nous utilisons l'image "phpmyadmin" toujours, mappant le port 80 du conteneur vers 8080 sur l'hôte.

Ensuite nous lions ce conteneur au conteneur "mariadb", définissons le redémarrage sur toujours et enfin nous définissons certaines variables environnement de l'image Docker, notamment l'ensemble "PMA_HOST".

 

Une fois fini, enregistrez le fichier et quittez nano.

Exécution de Docker Compose

Nous sommes maintenant prêts à exécuter docker-compose. Remarque: lorsque vous souhaitez exécuter docker-compose, vous devez figurer dans le répertoire du projet docker-compose et vous assurer que le fichier yml contient la configuration de la composition.

Exécutez la commande ci-dessous pour faire tourner l'ensemble LEMP :

docker-compose up -d

-d: nous sert à laisser le conteneur en cours d'exécution en tant que démon / en arrière-plan.

Vous pouvez voir que les nouveaux conteneurs ont été créés, vérifiez-le avec la commande ci-dessous :

docker-compose ps

Nous avons maintenant quatre conteneurs exécutant Nginx, PHP-fpm, MariaDB et PHPMyAdmin.

4_edited.png

Découvrir Docker Compose

avec un système Linux

@Macrima & Antoine

docker.png
bottom of page