{{tag>noble serveur virtualisation}}
{{ :icons:docker-mark-blue.png?110|Icône de Docker}}
====== Docker Compose ======
**[[wpfr>Docker_(logiciel)#Outils_associés|Docker Compose]]** permet de définir et exécuter de multiples conteneurs [[:docker]], en les décrivant et les paramétrant dans un fichier texte (ou plus précisément [[wpfr>YAML]], un format particulièrement simple et lisible).
Ceci permet en premier lieu de simplifier extrêmement la ligne de commande ''[[man>docker]]'', et surtout //in fine// de décrire des services avec leurs environnements complets et éventuellement indépendants, et de toucher à ce qu'on appelle l'//[[wpfr>infrastructure as code]]//.
**Docker Compose** est une extension de **[[:Docker]]**.
C'était auparavant une application autonome. Elle ne s'installe plus de la même façon et on n'utilise plus la commande :
docker-compose
mais
docker compose
Certaines documentations anciennes sont donc à ajuster, et tomber sur la commande ''docker-compose'' dans une documentation est un (assez mauvais) signe de son ancienneté !
De la même manière un fichier ''docker-compose.yml'' commençant par ''version='' doit être mis à jour, car cette directive n'est plus utilisée.
===== Installation =====
Voir aussi les documentations officielles :
* **(//en//)** //[[https://docs.docker.com/desktop/setup/install/linux/|Install Docker Desktop on Linux]]//
* **(//en//)** //[[https://github.com/docker/compose#linux|Where to get Docker Compose]]//
==== Depuis les dépôts officiels d'Ubuntu (conseillé) ====
Il suffit d'[[:tutoriel:comment_installer_un_paquet|installer le paquet]] ''[[apt>docker-compose]]'' :
sudo apt install docker-compose
==== Depuis le dépôt docker (conseillé pour avoir une version plus récente) ====
Reportez-vous au chapitre //[[:docker#Dépôt APT Docker]]//.
==== Avec le binaire (préférer une des solutions précédentes) ====
**Docker Compose** tient dans un fichier binaire, il est donc facile de passer à la dernière version ou à une version spécifique.
Tout d'abord, si vous aviez installé une précédente version, supprimez-la, par exemple si version des dépôts officiels :
sudo apt remove docker-compose
Télécharger ensuite la version que vous souhaitez à partir de [[https://github.com/docker/compose/releases]] par exemple, pour la v5.0.1 : [[https://github.com/docker/compose/releases/download/v5.0.1/docker-compose-linux-x86_64]]\\
puis créer un répertoire :
sudo mkdir -p /usr/local/lib/docker/cli-plugins
pour y déplacer le fichier :
sudo mv docker-compose-linux-x86_64 /usr/local/lib/docker/cli-plugins/docker-compose
puis rendre celui-ci exécutable :
sudo chmod +x /usr/local/bin/docker-compose
Vérifier que docker-compose s'appelle correctement :
docker compose --version
doit retourner une ligne du type ''Docker Compose version v5.0.1''.
La mise à jour peut être faite alors que des containers sont en cours d'utilisation.
===== Utilisation =====
Depuis la version ''2'', **Docker Compose** est une extension (//plug-in//) de docker qui ajoute la sous-commande ''compose'' à la commande ''docker''.\\
Son appel se fait donc pardocker composesans le trait d'union ''-'' entre les 2 mots.
La commande ''docker compose'' va chercher un fichier ''[[https://docs.docker.com/compose/intro/compose-application-model/#illustrative-example|docker-compose.yml]]'' qui décrit au format [[wpfr>YAML]] des services [[:docker]] et leur configuration :
* nom d'un ou plusieurs services docker avec pour chacun, entre autre :
* une //image// docker (éventuellement à construire -- //build// -- et) à lancer
* des variables d'environnement (//environment//)
* des //volumes// ou montages (type //[[:fstab#monter_un_repertoire_avec_l_option_bind_de_la_commande_mount|bind mount]]//) à utiliser
* l'ID de utilisateur (//user//) qui lance le processus
* le réseau (//network//) docker auquel se connecter
* la déclaration et les paramètres des volumes (espaces de stockages persistés et points de montage)
* la déclaration et les paramètres des réseaux docker
etc.
Pour la liste complète et la description de chaque élément, voir la [[https://docs.docker.com/reference/compose-file/|documentation officielle]] (malheureusement non traduite). Ces éléments sont assez directement tirés des paramètres de la commande ''[[man>docker]]''.
Un seul fichier ''docker-compose.yml'' permet de décrire plusieurs containers (pour un serveur [[:LAMP]] par exemple [[:apache2|Apache]], [[:php|PHP-FPM]], [[:MariaDB]], [[https://github.com/mailhog/MailHog|MailHog]], etc.).\\
Le déploiement d'un environnement complet pour une, voire plusieurs application(s) web peut alors se résumer à la récupération d'un ''docker-compose.yml'' (parfois accompagné d'autres fichiers : ''Dockerfile'', fichiers de configuration destinés à être copiés dans le container, etc.) suivie de la commande :
docker compose up
La définition complète de l'environnement pèse ainsi seulement quelques kilo-octets, et son partage ou sa migration vers une nouvelle machine sont extrêmement rapides et faciles.
Avec le format [[wpfr>YAML]] l'indentation est très importante et devient sémantique ! La moindre espace en trop ou au contraire oubliée au début d'une ligne rend le fichier inutilisable.
Les fichiers sont très lisibles, clairs et rapides à écrire mais c'est un détail auquel il faut faire attention.
Les développeurs d'applications web et autres services libres fournissent très souvent des fichiers ''docker-compose.yml'' en exemple, qu'on peut adapter rapidement, et exploiter en quelques minutes !
Pour arrêter les services, entrez la commande :
docker compose down
Pour afficher la liste des commandes disponibles :
docker compose help
===== Problèmes =====
Si la commande ''docker compose'' retourne l'erreur :
1 error occurred:
* error listing credentials - err: exec: "docker-credential-secretservice": executable file not found in $PATH
dans le fichier ''~/.docker/config.json'', modifier le mot-clé ''credsStore'' pour ''credStore''.((source **(//en//)** : //[[https://forums.docker.com/t/docker-credential-desktop-exe-executable-file-not-found-in-path-using-wsl2/100225/5|
Docker-credential-desktop.exe executable file not found in $PATH using wsl2 ]]//))
===== Voir aussi =====
* [[https://github.com/docker/compose|GitHub]]
* **(//en//)** [[https://docs.docker.com/compose/|documentation officielle]]
* [[:Docker]]
* [[https://podman.io/|Podman]], une alternative à **Docker**
* Avec **Podman** un équivalent de **Docker Compose** serait **[[https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html|Quadlet]]** (basé sur [[:systemd]]), mais il s'en éloigne cette fois beaucoup plus (que **Podman** par rapport à **Docker**).
* **[[https://doc.traefik.io/traefik/reference/install-configuration/providers/docker/|Traefik]]**, un //reverse proxy// pour **Docker** (et en particulier **Docker Compose**), permettant d'associer les services à des [[:web#noms de domaines]], gérer les redirections, les [[:tutoriel:securiser_apache2_avec_ssl|certificats SSL]], etc., simplement en ajoutant des directives aux fichiers ''docker-compose.yml''.
----
//Contributeurs : [[:utilisateurs:bcag2]], [[:utilisateurs:krodelabestiole]].//