Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
technique:tech_team:pres_compose [2021/10/16 20:04] – créée qduchemi | technique:tech_team:pres_compose [2021/11/16 00:42] (Version actuelle) – qduchemi | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
## C'est quoi Docker Compose ? | ## C'est quoi Docker Compose ? | ||
- | On l'a vu, Docker est assez simple | + | Docker |
- | Cependant, sur une activité d' | + | ### 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' | + | < |
- | Ceci veut dire qu'à chaque démarrage de conteneur, il faudrait écrire des commandes | + | Pour comprendre pourquoi on utilise un outil supplémentaire, il est utile de revenir [[technique: |
- | ```bash | + | ``` |
- | docker run -v < | + | docker run -d --name quentin |
``` | ``` | ||
- | C' | + | C' |
- | C' | + | Et c' |
- | 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é |
- | Pour donner une intuition, voici un fichier `docker-compose.yml` fictif qui vise à faciliter l'administration | + | ### Cas d' |
+ | |||
+ | 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ées. Compose permet de décrire les dépendances entre ces conteneurs, et de les lancer d'un seul coup. | ||
+ | |||
+ | Compose est aussi très utile pour déclarer des volumes ou des réseaux Docker, dont on reparlera avec [[technique: | ||
+ | |||
+ | Enfin, toutes les commandes Compose permettent de vérifier les journaux | ||
+ | |||
+ | ### Un détour par le format YAML | ||
+ | |||
+ | Les fichiers de configuration de Docker Compose sont au format `YAML`. C' | ||
```yaml | ```yaml | ||
- | version: '3.7' | + | artists: |
+ | - title: System of a Down | ||
+ | year: 1992 | ||
+ | albums: | ||
+ | - ... | ||
+ | - title: Mansfield.TYA | ||
+ | year: 2002 | ||
+ | |||
+ | theaters: | ||
+ | maroquinerie: | ||
+ | title: La maroquinerie | ||
+ | trianon: | ||
+ | title: Le Trianon | ||
+ | ``` | ||
- | volumes: | + | 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' |
- | db: | + | |
+ | < | ||
+ | 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, | ||
+ | |||
+ | En YAML, quand on a pas besoin de se référer explicitement à des sous-éléments, | ||
+ | </ | ||
+ | |||
+ | ### 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, | ||
+ | |||
+ | 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 " | ||
+ | |||
+ | 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 : | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | 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, | ||
+ | |||
+ | ```yaml | ||
+ | version: " | ||
+ | ``` | ||
+ | |||
+ | < | ||
+ | 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. | ||
+ | </ | ||
+ | |||
+ | Regardons la suite : | ||
+ | |||
+ | ```yaml | ||
+ | version: " | ||
- | networks: | ||
- | app: | ||
- | | ||
services: | services: | ||
- | | + | |
- | image: | + | image: |
- | | + | |
ports: | ports: | ||
- | - 80:8080 | + | - 8001:80 |
- | networks: | + | |
- | - app | + | |
- | environment: | + | |
- | ADMIN_PASSWORD: | + | |
- | + | ||
- | db: | + | |
- | image: postgres | + | |
- | networks: | + | |
- | - app | + | |
- | environment: | + | |
- | POSTGRES_PASSWORD: | + | |
volumes: | volumes: | ||
- | - db:/var/lib/postgresql | + | - ./website:/var/www/html |
``` | ``` | ||
- | Sans comprendre tous les éléments | + | < |
- | * `app` utilise | + | 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`. |
- | * `db` utilise l'image `postgres`, la met dans le même réseau | + | |
+ | < | ||
+ | |||
+ | Ensuite, les autres directives devraient te parler d' | ||
+ | |||
+ | ### Gérer les volumes avec Compose | ||
+ | |||
+ | Si tu te rappelles, on avait [[technique: | ||
+ | |||
+ | Voici comment on ferait avec Compose : | ||
+ | |||
+ | ```yaml | ||
+ | volumes: | ||
+ | quentin_data: | ||
+ | name: quentin_data | ||
+ | |||
+ | services: | ||
+ | quentin: | ||
+ | [...] | ||
+ | volumes: | ||
+ | - quentin_data:/ | ||
+ | ``` | ||
+ | |||
+ | Ici, pas besoin de faire de `docker volume create`, Compose s' | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | |||
+ | ### 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: | ||
+ | ``` | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | < | ||
+ | |||
+ | Compose a créé | ||
+ | |||
+ | Maintenant, on voudrait bien mettre notre page d' | ||
+ | |||
+ | ``` | ||
+ | vim index.html | ||
+ | docker cp index.html quentin:/var/www/html | ||
+ | ``` | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | |||
+ | Il suffit d' | ||
- | < | ||
```bash | ```bash | ||
- | docker-compose | + | # Exécute la commande bash dans le conteneur quentin |
+ | docker-compose | ||
``` | ``` | ||
- | </ | ||
+ | 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. | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | On constate en même temps que dans le conteneur il n'y a aucun éditeur. C'est parce que dans l' | ||
+ | |||
+ | ### D' | ||
+ | |||
+ | < | ||
+ | |||
+ | Pour le reste, on ne liste pas tout sur le wiki, mais on peut retrouver l' | ||
+ | |||
+ | ### Compléments | ||
+ | |||
+ | < | ||
+ | |||
+ | ### 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: | ||
+ | |||
+ | Est-ce-qu' | ||
+ | |||
+ | < | ||
+ | |||
+ | 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`, | ||
+ | |||
+ | Et bien c'est là qu' |