Différences

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

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
technique:tech_team:pres_compose [2021/11/15 23:19] qduchemitechnique:tech_team:pres_compose [2021/11/16 00:42] (Version actuelle) qduchemi
Ligne 78: Ligne 78:
  
 Note comment la barre du bas change au fil des commandes (`I` puis `:wq`). Note comment la barre du bas change au fil des commandes (`I` puis `:wq`).
 +
 +On est maintenant équipé pour écrire des fichiers Compose sur les machines ! ^_^
 +
 +### Ton premier fichier Compose
 +
 +On va ré-écrire la première commande de cette page, mais à l'aide d'un fichier Compose.
 +
 +La première étape, c'est de déclarer la « version » du fichier de configuration. Actuellement, on utilise la `3.7`, mais [chaque version apporte ses évolutions](https://docs.docker.com/compose/compose-file/) :
 +
 +```yaml
 +version: "3.7"
 +```
 +
 +<bootnote>
 +Note les guillemets pour indiquer une chaîne de caractère. Des fois, les guillemets sont optionnels, mais sur la version Compose râle s'ils n'y sont pas.
 +</bootnote>
 +
 +Regardons la suite :
 +
 +```yaml
 +version: "3.7"
 +
 +services:
 +  quentin:
 +    image: nginx:quentin
 +    container_name: quentin
 +    ports:
 +      - 8001:80
 +    volumes:
 +      - ./website:/var/www/html
 +```
 +
 +<bootnote critical>Tout ceci est à adapter avec les noms et ports de vos propres conteneurs!</bootnote>
 +
 +On commence par déclarer un ensemble de **services**. Dans la terminologie Compose, un service = un conteneur. Ici, il n'y en a qu'un, c'est notre serveur web. On le **nomme** `quentin` juste en dessous de la directive `services`.
 +
 +<bootnote warning>C'est très utile de nommer le service, car on pourra ensuite s'y référer avec les commandes Compose (redémarre tel service, montre moi les journaux de tel service, etc). Mais ce n'est pas nécessairement le même nom que celui du conteneur! Ici, oui, mais ce sont deux entités différentes - le nom du service n'a de sens que pour les commandes Compose.</bootnote>
 +
 +Ensuite, les autres directives devraient te parler d'elles-mêmes si tu as suivi la partie sur la [[technique:tech_team:tuto_docker|fabrication d'une image Docker]]. On choisit l'image, on nomme le conteneur, on indique les mapping entre port hôte et port conteneur, puis les montages.
 +
 +### Gérer les volumes avec Compose
 +
 +Si tu te rappelles, on avait [[technique:tech_team:tuto_docker#passer_aux_choses_serieuses|utilisé les volumes Docker]] plutôt que les points de montage pour les conteneurs. C'était plus pratique, notamment pour des raisons de portabilité.
 +
 +Voici comment on ferait avec Compose :
 +
 +```yaml
 +volumes:
 +  quentin_data:
 +    name: quentin_data
 +  
 +services:
 +  quentin:
 +    [...]
 +    volumes:
 +      - quentin_data:/var/www/html
 +```
 +
 +Ici, pas besoin de faire de `docker volume create`, Compose s'occupera de tout ! Créer un volume Docker qui s'appelle `quentin_data`, et le monter sur `/var/www/html` dans le conteneur !
 +
 +<bootnote>Il suffira ensuite de faire un `docker cp` pour copier des fichiers dans le volume, et les garder au fil des recréations du conteneur.</bootnote>
 +
 +<bootnote learn>On a fait une documentation plus complète sur les volumes [[technique:docker:good_practices:storage|par ici]] !</bootnote>
 +
 +### Et comment on lance tout ça ?
 +
 +Une fois que le fichier est édité, une commande ~~pour les gouverner tous~~ pour tout lancer :
 +
 +```
 +# -d pour détacher, lancer en arrière plan
 +docker-compose up -d
 +```
 +
 +Pour vérifier que tout s'est bien passé, on peut consulter les journaux. S'il n'y a aucun message, c'est plutôt bon signe.
 +
 +```
 +docker-compose logs
 +```
 +
 +On peut ensuite vérifier que tout s'est bien lancé :
 +
 +```
 +curl pica01-test.picasoft.net:8001
 +```
 +
 +{{ :technique:tech_team:compose_volume.gif |}}
 +
 +<bootnote question>Heu, on a pas monté un volume vide dans `/var/www/html` ? Pourquoi ça affiche un truc ?</bootnote>
 +
 +Compose a créé le volume `quentin_data` et l'a monté sur `/var/www/html`. Mais ce volume est vide alors que le dossier de l'image n'est pas vide ! Il contient la page d'accueil par défaut de `nginx`. Alors Docker copie le contenu du dossier dans le volume ; c'est bien pratique pour ne pas écraser des choses par erreur.
 +
 +Maintenant, on voudrait bien mettre notre page d'accueil. C'est l'occasion de se rappeler comment on copie un fichier dans un volume Docker :
 +
 +```
 +vim index.html
 +docker cp index.html quentin:/var/www/html
 +```
 +
 +<bootnote critical>Cette opération est différente d'un montage, car à présent le fichier **est** dans le volume et y reste ! Même si on le supprime de l'hôte, il reste dans le volume. Il faudrait le modifier depuis l'intérieur du conteneur pour qu'il soit modifier dans le volume, ou copier un nouveau fichier.</bootnote>
 +
 +<bootnote question>Et comment on fait pour modifier le fichier dans le conteneur ?</bootnote>
 +
 +Il suffit d'ouvrir un shell dedans :
 +
 +```bash
 +# Exécute la commande bash dans le conteneur quentin
 +docker-compose exec quentin bash
 +```
 +
 +Et de faire sa vie !
 +
 +Voyons que ce ça donne en action : copier un fichier dans le volume, le supprimer, voir que ça ne change rien, puis modifier le fichier dans le conteneur.
 +
 +{{ :technique:tech_team:compose_volume_cp.gif |}}
 +
 +On constate en même temps que dans le conteneur il n'y a aucun éditeur. C'est parce que dans l'image `debian` sur laquelle on s'est basée, il n'y en a pas ; et pour cause, un service n'a pas besoin d'éditeur de texte.
 +
 +### D'autres commandes Compose ?
 +
 +<bootnote learn>[[:technique:docker:picasoft:admin|Cette page du wiki]] répertorie quelques commandes utiles que fournit Compose! </bootnote>
 +
 +Pour le reste, on ne liste pas tout sur le wiki, mais on peut retrouver l'ensemble des commandes [sur la documentation de Compose](https://docs.docker.com/compose/reference/)
 +
 +### Compléments
 +
 +<bootnote learn>Il y toute une [[technique:docker:good_practices:start|section du wiki]] dédiée à Compose, qui explique un peu plus formellement les choses. N'hésite pas à y jeter un œil !</bootnote>
 +
 +### Et maintenant ?
 +
 +On est déjà pas mal, on a un moyen de créer des conteneurs de façon stable, à partir d'un fichier de configuration. Mais il manque encore quelque chose... vous ne trouvez pas que `pica01-test.picasoft.net:8081`, c'est un peu bizarre comme URL ?
 +
 +Est-ce-qu'on a envie de cliquer sur une URL comme ça ? Typiquement, `team.picasoft.net`, c'est un peu plus joli.
 +
 +<bootnote>Rappel : quand on ne précise pas de port dans une URL, c'est le port 80, le port standard du web, qui est sélectionné automatiquement.</bootnote>
 +
 +Mais on a vu que le port 80 ne pouvait être écouté que par un seul service. Alors, si on a plusieurs URLs `team.picasoft.net`, `pad.picasoft.net` qui tournent sur la même machine, comment on fait ? 
 +
 +Et bien c'est là qu'entre en scène Traefik, l'une des pièces les plus importantes de l'infrastructure ! Direction [[technique:tech_team:traefik|la prochaine page pour en savoir plus]] ! ^_^
  • technique/tech_team/pres_compose.1637014794.txt.gz
  • de qduchemi