`image: ...` sert à définir l'image utilisée. On les trouve sur le site [Docker Hub](https://hub.docker.com/). Il faut pivilégier les images officielles, signalées par un badge vert avec une étoile.
Pour utiliser une image faite grâce à un dockerfile, ????
`ports: ...` est suivi de la liste (avec tirets) des ports que l'on souhaite exposer. En général, si l'énoncé dit d'exposer le port 1234, il faut noter `1234:1234`. Le nombre à gauche désigne le port sur la machine, et celui à droite, le port sur la VM. Si le port n'est pas donné (pour cAdvisor, Grafana et autres, par exemple), il est disponible en ligne.
`volumes: ...` est suivi de la liste des volumes que l'on souhaite monter dans la VM. Chaque ligne est au format `path-machine:path-VM`, c'est à dire que s'il on demande de partager le dossier web (présent sur la machine) dans /usr/share/nginx/html, on écrira `- ./web:/usr/share/nginx/html`. Si le volume est un des volumes sont définis dans la partie `volumes` extérieure à la partie `services` (voir plus loin), on remplace le path dans la machine par le nom donné au volume.
`networks: ...` est suivi de la liste des réseaux auxquels on veut que ce servce aie accès. Si on utilise des exporters (cAdvisor, node-exporter...), tous les services devront avoir au moins un réseau en commun avec l'exporter. Les réseaux sont définis dans la partie `networks` extérieure à la partie `services` (voir plus loin)
`environment: ...` est suivi de la liste des variables d'environnement qu'on veut créer dans ce service. Chaque ligne est au format `nom:valeur`.
> Les éléments dits "suivi d'une liste" doivent toujopurs être suivis de listes à tirets, même s'il n'y a qu'un seul élément.
`restart: always` indique que le restart est continu.
Pour déployer plusieurs instances d'un même service, on utilise :
On définit les réseaux dans la partie `networks`. Elle est différente de la partie networks à l'intérieur de la définition d'un service, et n'est pas identée.
On définit les volumes dans la partie `volumes`. Elle est différente de la partie volumes à l'intérieur de la définition d'un service, et n'est pas identée.
On donne le nom puis la définition du réseau. Ici, pas besoin de définition car le volume est vide. On peut aussi ajouter {} après les : pour signifier que la volume est vide
On lance le fichier avec `docker compose up -d` (pas de tiret entre docker et compose !!!). Le `-d` sert a lancé l'activité en arrière-plan et donc à pouvoir utiliser le terminal.
Si le fichier utiliise un autre nom que `docker-compose.yml`, on utilise `docker compose -f nom-fichier.yml up -d`
Pour savoir si le docker compose a fonctionné, on vérifie que la commande `docker compose up` n'a pas fait d'erreur. On lance la commande `docker ps` et on vérifie que la nouvelle VM est affichée.
Pou se connecter à un conteneur (ici `php` du dossier `tp4`), on fait `docker exec -it tp4-php-1`
-`tp4` est le nom du dossier
-`php` est le nom du conteneur
- on met le nombre même si on n'a créé qu'un seul conteneur avec ce nom
Pour vérfier les réseaux présents, on fait `docker inspect`. Pour vérifier les réseaux présents dans un conteneur en particulier, on ajoute le nom du conteneur à la fin de la commande en suivant la grammaire dossier-fichier-numéro.
Pour supprimer tous les conteneurs, on fait `docker compose down`.