Docker Compose
Introduction
**Prérequis : connaitre docker **
Compose est une technologie docker permettant de configurer, manager, et facilement déployer un ou plusieurs containers docker.
L’essentiel des manipulations passe par un fichier docker-compose.yml, qui nous permet d’exécuter des actions qui prendraient sinon d’interminables lignes de commandes, en exécutant une simple commande docker compose up à l’emplacement du fichier yaml.
Par exemple, une commande
sudo docker run --name webapp -itd -p 8080:80 --restart always apache
Pour déployer un container apache en lui précisant un nom, un port d’exposition, une image docker, etc peut être résumée au format yaml :
[...]
webapp:
image: apache
ports:
- "8080:80"
restart : always
[...]
Pour déployer plusieurs containers à la fois, il suffit de les ajouter à la section services: (en prenant garde à ne pas exposer plusieurs containers sur le même port de la machine hôte)
version: "3"
services:
webapp-1:
image: apache
ports:
- "8080:80"
restart : always
webapp-2:
image: ngnix
ports:
- "8081:80"
restart : always
A présent, exécuter la commande docker compose up -d (-d pour “detach”, et garder l’usage de notre console) déploiera automatiquement tous les containers listés avec les options énumérées.
Il est également possible de préciser l’emplacement du fichier docker-compose.yml avec l’option -f
Docker composant étant un orchestrateur de docker très basique, il permet de générer des dockers à la volé avec la commance docker-compose scale nom_docker=nb_de_docker_voulu. il faut d’ailleurs paramettrer une plage de port pour que cela fonctionne.
Exemple en reprenant:
version: "3"
services:
webapp:
image: apache
ports:
- "8080 - 8084:80"
restart : always
avec cette exemple je peux générer 5 dockers en une simple seconde avec la commande docker-compose scale webapp=5. Afin de les détruire il suffit d’utiliser la commande docker-compose down. Attention cependant, tout les dockers générer a partir du docker-compose.yml seront supprimer. Pour supprimer les images il suffira de rajouter --rmi all et pour les volumes -v.
Cheatsheet
Généralités :
Il est possible de définir des propriétés communes à chaque container, en les écrivant en dehors du scope de services.
Elles peuvent toujours êtres remplacées par des règles plus précises lorsqu’écrites dans un scope plus petit.
Ex:
version: "3"
services:
webapp-1:
image: apache
ports:
- "8080:80"
restart: unless-stopped
webapp-2:
image: ngnix
ports:
- "8081:80"
restart: always
La valeur de la propriété restart écrite toute en bas s’applique à la fois à notre webapp-1, et notre webapp-2.
Mais webapp-1 a aussi une propriété restart dans son propre scope, c’est donc celle-ci qui a la priorité pour ce container.
Liste des propriétés les plus utiles :
image:
Indispensable, c’est le nom de l’image docker qui sera récupérée sur docker hub si elle n’est pas déjà présente sur le système.
Si plusieurs versions sont disponibles, il est possible de préciser la version de celle-ci au format :
image:version
Par défaut, c’est la dernière version qui sera récupérée (l’équivalent de image:latest)
ports:
Définit les redirections de ports sur la machine host, au format liste : - host:container. C’est l’équivalent de l’option -p dans la commande docker run.
Ex :
ports:
- "3000"
- "8000:80" # host:container
volumes:
Egalement au format liste, permet de monter des volumes syncronisés entre l’hôte et le container pour assurer la persistance des données, même en cas d’extinction du container.
Format : - path/to/host/folder:path/to/container/folder
Ex :
volumes:
- ./_data:/var/lib/mysql
environnement:
Permet de redéfinir les variables d’environnement des containers.
Ex :
environment:
RACK_ENV: development
A noter qu’il est également possible de charger les variables d’environnement depuis un ou plusieurs fichiers :
env_file: .env
env_file: [.env, .development.env] #Plusieurs fichiers !
depends_on:
Précise les dépendances, en listant les containers qui doivent être chargés avant celui-ci (penser à réspecter le scope)
Ex :
depends_on:
- dbcontainer
command
Ajoute des commandes ou des options à l’exécution du container.
Ex (pour prometheus) :
command:
- --config-file=path
- --web-enable-lifecycle
- some command -option