4.5 KiB
Fichier docker-compose.yml
Structure
services :
nomA:
...
...:
- ...
(définition du serveur)
nomB:
...
...:
- ...
(définition du serveur)
volumes :
vol1 : ...
vol2 : ...
networks :
net1 : ...
net2 : ...
/!\ Ce ne sont pas des indentations mais des doubles espaces
Définition des services
On définit les services dans la partie services
. On commence par le nom qu'on veut donner au service, puis on le définit.
services:
php:
image: windok/php-redis
restart: always
volumes:
- ./web:/usr/share/nginx/html
environment:
- NOM : "moguljak"
- PRENOM : "tom"
deploy:
replicas: 2
networks:
- front
- back
image: ...
sert à définir l'image utilisée. On les trouve sur le site Docker Hub. 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 :
deploy:
replicas: 2
Définition des réseaux
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.
networks:
front:
back:
On donne le nom puis la définition du réseau. Ici, pas besoin de définition
Définition des volumes
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.
volumes:
redis_data:
redisinsight_data:
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
Utilisation
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.
Pour 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 créer un réseau externe (qui regroupe plusieurs machines séparées), on utilise la commande docker network create nom_network
.
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
.