Docker/Docker compose
La commande docker compose
est un utilitaire généralement fourni avec Docker, permettant d'orchestrer plusieurs images et conteneurs avec la même commande[1]. Pour ce faire, les paramétrages de l’ensemble des conteneurs doit être définit dans le fichier docker-compose.yml à la racine du projet. Toutefois il est possible de surcharger des parties de ce fichier au lancement des conteneurs, pour chaque environnement[2].
CommandesModifier
versionModifier
Version de Docker Compose[3]. Exemple en 2019 :
version: '3.7'
networksModifier
Définition du réseau des VM Docker.
servicesModifier
Liste des conteneurs à construire.
imageModifier
Nom de l'image à télécharger (sur https://hub.docker.com/ ou un dépôt privé). Elle peut être suivie d'un tag pour en indiquer la version.
Exemples :
image: 'mariadb'
image: 'mariadb:latest'
image: 'mariadb:10.4'
extendsModifier
"image" permet donc de lancer un groupe d'applications, qui sont par ailleurs lançables individuellement. Mais pour partager des configurations on peut aussi utiliser "extends"[4] :
extends:
file: webapp/docker-compose.yml
service: webapp
buildModifier
Alternativement à l'image, on peut indiquer le chemin d'un dockerfile pour construire son propre conteneur.
Si le conteneur ne partage aucun fichier avec d'autres, indiquer simplement le nom du dossier contenant le dockerfile :
build: './php8.1-fpm'
Sinon, préciser le contexte où le conteneur devra récupérer les fichiers partagés nécessaires à son build :
build:
context: .
dockerfile: './php8.1-fpm/Dockerfile'
volumesModifier
Mapping des répertoires partagés entre la machine hôte et le conteneur :
volumes:
- '$HOME/www:/var/www'
La variable $HOME vaut "~" par défaut (dossier de l'utilisateur courant), mais peut être remplacée dans le fichier .env.
portsModifier
Mapping du partage des ports. Ex :
ports:
- '3306:3306'
environmentModifier
Injecte des variables d'environnement dans le conteneur. Très utile pour que les conteneurs soient à l'heure de la machine hôte :
environment:
TZ: Europe/Paris
environment:
n'accepte pas les sous-tableaux : il faut les convertir en JSON.
env_fileModifier
Définit le nom d'un fichier contenant des variables d'environnement récupérables dans docker-compose.yml, avec la syntaxe "${ma_variable}". Exemple :
env_file: .env
environment:
HOST_UID: "${UID}"
Sur Windows le changement de l'UID entraine une modification des droits de tous les fichiers.
depends_onModifier
Permet de spécifier qu'un conteneur doit en attendre un autre pour être lancé.
restartModifier
Indique si le conteneur doit se lancer au démarrage du daemon Docker (donc de la machine hôte). Vaut "no" par défaut. Ex :
restart: always
Autre valeur possible : unless-stopped
container_nameModifier
Permet de forcer un nom de conteneur.
hostnameModifier
Permet de forcer un nom de machine dans le conteneur. Utile si on a une application qui doit pointer dessus dans son .env (car "localhost" fonctionne quand le serveur était installé directement sur la machine hôte mais pas dans un conteneur).
networkModifier
Permet de forcer une adresse IP pour le conteneur.
Dans docker-compose.yml, il faut toujours remplir le paramètre "default" de "networks" pour ne pas qu’il prenne une plage utilisée.
extra_hostsModifier
Remplit le /etc/hosts du conteneur. Ex :
extra_hosts:
- 'mon_serveur_local.localhost:172.20.0.2'
commandModifier
Pour exécuter un script à chaque lancement du conteneur.
command: ls -alh
ou en multiligne :
command: |
ls -alh
ou :
command: ['ls', '-alh']
ou si la commande est dans un fichier :
command: /bin/ls.sh
entrypointModifier
Pour définir le dernier script exécuté à chaque lancement du conteneur.
ttyModifier
Équivalent à docker -t
: ajoute un pseudo-terminal pour interagir avec le conteneur.
ExemplesModifier
MinimalModifier
Exemple de docker-compose.yml contenant un seul conteneur CentOS, qui a le droit d'accéder au dossier ~/www :
version: '3.2'
services:
centos:
image: 'centos/systemd'
volumes:
- '$HOME/www:/var/www'
CompletModifier
version: '3.2'
networks:
default:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.170.0.0/16
services:
mariadb:
hostname: 'mariadb'
image: 'mariadb:10.4'
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: 'wikibooks'
# Partage pour les commandes SQL "into outfile" et "load data infile"
volumes:
- '$HOME/www:/var/www'
restart: always
networks:
default:
ipv4_address: 172.170.0.3
adminer:
hostname: 'adminer'
image: 'adminer'
ports:
- 8080:8080
restart: always
networks:
default:
ipv4_address: 172.170.0.4
GestionModifier
Pour relancer le conteneur (sur Windows ou Linux) :
docker compose stop; docker compose build; docker compose up -d
Pour rentrer dedans :
docker compose exec centos bash
Ou le lancer et rentrer dedans en même temps :
docker compose run centos bash
Ou exécuter une seule commande shell dedans avant de revenir à la machine hôte :
docker compose exec centos sh -c 'ls -alh'
LogsModifier
Pour voir les logs de tous les conteneurs en live :
docker compose logs -f
Pour voir les logs d'un seul conteneur :
docker compose logs nom_du_conteneur
Supprimer les logsModifier
L'emplacement des logs d'un conteneur est visible avec :
docker inspect --format='{{.LogPath}}' nom_du_conteneur
Sur LinuxModifier
Tous les conteneursModifier
Pour supprimer les logs de tous les conteneurs sur Linux :
docker compose stop
find /var/lib/docker/containers/ -type f -name "*.log" -delete
docker compose up -d
Un seul conteneurModifier
Pour ne supprimer les logs que d'un seul conteneur :
docker compose stop mon_conteneur
sudo rm $(sudo docker inspect --format='{{.LogPath}}' mon_conteneur)
docker compose up -d mon_conteneur
Sur WindowsModifier
Sur Windows, comme les logs sont dans le fichier C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx, il faut d'abord se connecter à la VM Docker pour exécuter cette commande[5]. Exemple en DOS :
docker run --privileged -it -v /var/run/docker.sock:/var/run/docker.sock jongallant/ubuntu-docker-client
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh
chroot /host