Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
technique:tech_team:pres_compose [2021/10/16 20:04] – créée qduchemitechnique:tech_team:pres_compose [2021/11/15 23:19] qduchemi
Ligne 2: Ligne 2:
 ## C'est quoi Docker Compose ? ## C'est quoi Docker Compose ?
  
-On l'a vu, Docker est assez simple d'utilisation : un `docker build`, un `docker run`, et notre conteneur est lancé.+Docker Compose est un outil d'**orchestration** de conteneurs
  
-Cependant, sur une activité d'hébergement de services, il y a parfois plusieurs dizaines de services à lancer.+### Mais pourquoi diable un énième outil ?
  
-Or, la configuration des volumes, des ports, des réseaux, etc, se fait au démarrage de chaque conteneur et n'est pas référencé dans l'image.+<bootnote question>C'est pas ce que fait déjà Docker, de gérer des conteneurs ?</bootnote>
  
-Ceci veut dire qu'à chaque démarrage de conteneur, il faudrait écrire des commandes à rallonge du type :+Pour comprendre pourquoi on utilise un outil supplémentaire, il est utile de revenir [[technique:tech_team:tuto_docker|à la page précédente]], où on a fabriqué et lancé une image Docker. Le conteneur avait un nom, un mapping de ports et un montage. La commande pour le lancer était la suivante :
  
-```bash +``` 
-docker run -v <volume>:<destination> -p <port source>:<port conteneur> --network <nom du réseau> <image>+docker run -d --name quentin -p 80:80 -v quentin:/var/www/html nginx:quentin
 ``` ```
  
-C'est inimaginable.+C'est déjà long, et encore, il n'y a que quelques options. Imagine qu'à chaque mise à jour, il faille taper la même commande pour relancer le conteneur! C'est long et pénible, il y a des risques d'erreurs, la « configuration » du conteneur n'est jamais stockée quelque part...
  
-C'est pourquoi Docker Compose a vu le jour : c'est un système d'**orchestration** de conteneurs.+Et c'est là qu'intervient Docker Compose. Compose permet de décrire à quoi doit ressembler un conteneur dans un fichier de configuration, et de gérer son cycle de vie avec des commandes simples.
  
-Compose se base sur des fichiers écrits au format `YAML`qui décrivent **comment** lancer les différents conteneurs.+C'est génial, parce que le fichier de configuration peut être versionné sur Git, partagé entre plusieurs machines et modifié collaborativementcontrairement à une grande ligne de commande.
  
-Pour donner une intuition, voici un fichier `docker-compose.yml` fictif qui vise à faciliter l'administration d'un service et de sa base de données :+### Cas d'usage de Compose
  
-```yaml +Compose est particulièrement indiqué pour les applications avec plusieurs conteneurs. Par exemple, Mattermost n'est pas un seul conteneur c'est un serveur web et une base de donnéesCompose permet de décrire les dépendances entre ces conteneurs, et de les lancer d'un seul coup.
-version: '3.7'+
  
-volumes: +Compose est aussi très utile pour déclarer des volumes ou des réseaux Docker, dont on reparlera avec [[technique:tech_team:traefik|Traefik]].
-  db:+
  
-networks: +Enfin, toutes les commandes Compose permettent de vérifier les journaux d'une application, de lister ses processus, de recréer intelligemment les conteneurs quand il y a besoin... Bref, on ne rentre pas dans tous les détails, place à la pratique!
-  app: +
-   +
-services: +
-  app: +
-    image: mattermost_app +
-    depends_on: mattermost_db +
-    ports: +
-      - 80:8080 +
-    networks: +
-      - app +
-    environment: +
-      ADMIN_PASSWORD: admin +
-  +
-  db: +
-    image: postgres +
-    networks: +
-      - app +
-    environment: +
-      POSTGRES_PASSWORD: password  +
-    volumes: +
-      - db:/var/lib/postgresql +
-```+
  
-Sans comprendre tous les éléments de syntaxe, on comprend que :+### Un détour par le format YAML
  
-* `app` utilise l'image `mattermost`, la met dans un réseau dédié, se relie au port 80 de la machine hôte, et dépend du service `db`. +Les fichiers de configuration de Docker Compose sont au format `YAML`. C'est un format qui exprime la « hiérarchie » par des espacesUn exemple simple où je veux décrire des groupes de musiques et des salles de concert :
-* `db` utilise l'image `postgres`, la met dans le même réseau que Mattermost, indique qu'il faut conserver le contenu du dossier `/var/lib/postgresql`, etc.+
  
-<bootnote>Ce fichier peut être distribué à n'importe qui, qui pourra alors lancer le service et sa base de données avec une simple commande qui se charge de configurer et de démarrer tous les services : +```yaml 
-```bash +artists: 
-docker-compose up+  title: System of a Down 
 +    year: 1992 
 +    albums: 
 +      - ... 
 +  - title: Mansfield.TYA  
 +    year: 2002 
 +     
 +theaters: 
 +  maroquinerie: 
 +    title: La maroquinerie 
 +  trianon: 
 +    title: Le Trianon
 ``` ```
 +
 +On voit qu'il y a deux « blocs » de premier niveau, et qu'à chaque décalage on décrit quelque chose de plus précis. Ce qu'il y avant un `:` s'appelle une clé et ce qu'il y a après s'appelle une valeur.
 +
 +<bootnote>
 +Il y a une différence subtile entre les artistes et les salles. Les artistes sont listés avec des `-` alors que les salles n'ont pas de tiret. Pourquoi ?
 +
 +C'est juste une histoire de nommage. Les artistes ne sont pas nommés, c'est simplement une liste. Ainsi, on pourrait dire « le premier artiste de `artists` », mais on ne peut pas le désigner directement.
 +Les salles sont nommées, on peut s'y référer directement, par exemple dire la salle `trianon`. 
 +
 +En YAML, quand on a pas besoin de se référer explicitement à des sous-éléments, on utilise des tirets, et sinon on les nomme et on utilise pas de tirets.
 </bootnote> </bootnote>
  
 +### vim : un goût amer mais bien utile
 +
 +La dernière fois, on a vu comment éditer un fichier avec `nano`. `nano` est bien pratique pour faire des petites modifications, mais est mauvais quand il s'agit d'éditer des fichiers YAML. Il n'y a pas de coloration syntaxique, pas d'espace automatique en allant à la ligne... c'est un enfer.
 +
 +Je te propose donc de découvrir `vim`, un éditeur plus difficile à prendre en main mais très pratique pour éditer des fichiers YAML!
 +
 +On va faire au plus simple : tu ouvres ton fichier `docker-compose.yml` avec `vim` :
 +
 +```
 +vim docker-compose.yml
 +```
 +
 +Tu appuies sur `I` pour rentrer en mode "insertion". Tu écris ton texte. Quand tu as fini, tu appuies sur `Échap`.
 +
 +Enfin, tu appuies sur `:` pour rentrer en mode « commande », tu écris « wq » (_write_ and _quit_), puis `Entrée`. Et _voilà_ ! Ça peut paraître contre-intuitif parce qu'on ne rentre pas dans le pourquoi du comment, mais c'est tout ce que tu as besoin de savoir. Démonstration :
 +
 +{{ :technique:tech_team:vim.gif |}}
 +
 +Note comment la barre du bas change au fil des commandes (`I` puis `:wq`).
  • technique/tech_team/pres_compose.txt
  • de qduchemi