docker_TP/explications_dockercompose.md

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.