Skip to main content

Compose

Tout cela fonctionne, mais n'est pas très pratique, car il faut se souvenir des différentes options.

Comment faire si on veut avoir plusieurs conteneurs ?

Comment stocker dans un fichier nos configurations ?

La solution s'appelle compose

info

Attention, historiquement, c'était la commande docker-compose, maintenant, c'est une option de la commande docker : docker compose. La commande historique est obsolète et ne fonctionne plus.

Ouvrez le dossier devops à l'aide de Vscode. (Allez le chercher dans wsl si vous êtes sous windows)

Puis créez un fichier compose.yaml. Recopiez le contenu suivant dans votre fichier.

services:
mysql:
image: mysql:latest
volumes:
- data_mysql:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
networks:
- devops
volumes:
data_mysql:
networks:
devops:
driver: bridge

Fonctionnement

Quelques explications :

  • services va définir la liste des conteneurs à créer.
  • mysql est le nom du conteneur créé. Avec les commandes docker précédentes, nous l'avions appelé demo_mysql. Ce conteneur se base sur la dernière image officielle de mysql hébergée chez hub.docker.com
  • volumes permet de définir un volume associé à ce conteneur

Ici, nous changeons un peu par rapport à nos commandes précédentes. Nous voulons persister les données, mais on veut que ce soit docker qui gère ce volume et non qu'il soit associé à notre arborescence. Nous avons besoin que notre base de données soient sauvegardée, mais nous n'avons pas besoin d'avoir accès à ces fichiers. C'est pourquoi, nous définissons un peu plus bas le mot clé volumes de manière globale en l'associant au même nom : data_mysql

Donc /var/lib/mysql sera sauvegardé dans un volume interne à docker.

  • environnement permet de définir les variables d'environnement, ici le mot de passe root de mysql
  • networks permet de définir un réseau interne. Tous les conteneurs ayant le même réseau pourront discuter naturellement à travers leur nom de service. networks doit être également défini globalement. Le driver bridge est celui par défaut.

Lancez votre conteneur

Vérifiez qu'il soit bien démarré

Entrez dedans à l'aide d'un shell

docker compose up -d
docker ps
docker compose exec mysql bash
exit

Ajoutons maintenant un second conteneur à notre fichier yaml à la ligne 10

    adminer:
build:
context: ./adminer
networks:
- devops
ports:
- "8080:8080"

Cette fois, nous allons créer un conteneur appelé adminer, non pas basé sur une image, mais construit à partir d'un fichier Dockerfile à ajouter dans un dossier devops/adminer à créer.

On utilise cette technique si on veut modifier une image de départ.

  • ports permet de définir les ports de communication entre le port local, celui qu'on pourra utiliser avec localhost associé au port de communication du conteneur.

Créez le fichier Dockerfile avec le contenu suivant :

FROM adminer

LABEL maintainer="Nicolas TRUGEON <nicolas.trugeon@univ-lr.fr>"

COPY test.txt /

Ce fichier Dockerfile est très simple, il définit quelle image sert de modèle et copie le fichier test.txt à la racine du conteneur.

Dans le dossier devops/adminer, créez un fichier test.txt placez y du contenu.

Il faut maintenant construire votre nouveau conteneur et le lancer

docker compose build
docker compose up -d
docker compose ps
docker compose exec adminer sh
ls /

Vérifiez que votre fichier test.txt est bien présent.

D'autres commandes existent pour créer votre conteneur sur mesure grâce au Dockerfile :

  • RUN : permet d'exécuter des commandes shell
  • ARG : permet de récupérer une variable d'environnement définit dans le fichier compose.yaml
  • ENV : permet de définir une variable d'environnement
  • WORKDIR : permet de définir le répertoire de travail
  • ...

Nous allons maintenant étudier un fichier compose plus complexe.

Ouvrez le dossier devphplp qu'on a utilisé pour les TP Symfony et wordpress avec Vscode.

Faites un git pull pour récupérer la dernière version.

Nous allons détailler ensemble son fonctionnement ainsi que le fichier Makefile associé.

Un fichier Makefile permet à la base de faire de la compilation, mais on peut s'en servir pour automatiser des tâches.