virli/tutorial/docker-advanced/compose.md

151 lines
3.9 KiB
Markdown
Raw Normal View History

2015-10-29 04:45:40 +00:00
\newpage
2017-10-16 01:10:34 +00:00
Composition de conteneurs
-------------------------
2015-10-29 04:45:40 +00:00
### Automatiser le lancement de conteneurs
2015-10-29 04:45:40 +00:00
2017-10-16 01:10:34 +00:00
Au lieu de faire un script pour construire et lancer tous vos conteneurs, nous
allons définir à la racine de notre projet un fichier `docker-compose.yml` qui
2019-10-16 01:54:56 +00:00
contiendra les paramètres d'exécution.
2016-09-14 20:51:14 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-09-15 02:27:59 +00:00
```yaml
2021-09-16 01:45:54 +00:00
version: "3.9"
services:
influxdb:
...
chronograf:
build: grafana/
image: nginx
ports:
- "3000:3000"
volumes:
- ./:/tmp/toto
links:
- influxdb
2016-09-14 20:51:14 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-09-14 20:51:14 +00:00
2017-10-16 01:10:34 +00:00
Ce fichier est un condensé des options que nous passons habituellement au
`docker container run`.
2016-09-14 20:51:14 +00:00
#### `version`
2016-09-14 20:51:14 +00:00
2017-10-16 01:10:34 +00:00
Notons toutefois la présence d'une ligne `version` ; il ne s'agit pas de la
2016-09-15 00:46:46 +00:00
version de vos conteneurs, mais de la version du format de fichier
2017-10-16 01:10:34 +00:00
`docker-compose` qui sera utilisé. Sans indication de version, la version
2020-09-21 21:48:16 +00:00
originale sera utilisée, ne vous permettant pas d'utiliser les dernières
fonctionnalités de Docker.
2016-09-15 00:46:46 +00:00
2016-09-14 20:51:14 +00:00
#### `services`
2016-09-15 02:27:59 +00:00
Cette section énumère la liste des services (ou conteneurs) qui seront gérés
par `docker-compose`.
2021-09-19 22:19:49 +00:00
Ils peuvent dépendre d'une image à construire localement, dans ce cas ils
auront un fils `build`. Ou ils peuvent utiliser une image déjà existante, dans
ce cas ils auront un fils `image`.
2016-09-15 02:27:59 +00:00
Les autres fils sont les paramètres classiques que l'on va passer à `docker
run`.
#### `volumes`
2016-09-15 02:27:59 +00:00
Cette section est le pendant de la commandes `docker volume`.
2017-10-16 01:10:34 +00:00
On déclare les volumes simplement en leur donnant un nom et un driver comme
suit :
2016-09-15 02:27:59 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-09-15 02:27:59 +00:00
```yaml
volumes:
mysql-data:
driver: local
2016-09-15 02:27:59 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-09-15 02:27:59 +00:00
2017-10-16 01:10:34 +00:00
Pour les utiliser avec un conteneur, on référence le nom ainsi que
l'emplacement à partager :
2016-09-15 02:27:59 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-09-15 02:27:59 +00:00
```yaml
[...]
mysql:
2016-09-15 02:27:59 +00:00
[...]
volumes:
- mysql-data:/var/lib/mysql
2016-09-15 02:27:59 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-09-15 02:27:59 +00:00
#### `network`
2016-09-15 02:27:59 +00:00
Cette section est le pendant de la commandes `docker network`.
Par défaut, Docker relie tous les conteneurs sur un bridge et fait du NAT pour
2021-09-19 22:19:49 +00:00
que les conteneurs puissent accéder à l'Internet. Mais ce n'est pas le seul
mode possible !
2016-09-15 02:27:59 +00:00
De la même manière que pour les `volumes`, cette section déclare les réseaux
qui pourront être utilisés par les `services`. On pourrait donc avoir :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2016-09-15 02:27:59 +00:00
```yaml
networks:
knotdns-slave-net:
driver: bridge
2016-09-15 02:27:59 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-09-15 02:27:59 +00:00
##### Driver `host`
2016-09-15 02:27:59 +00:00
Le driver `host` réutilise la pile réseau de la machine hôte. Le conteneur
pourra donc directement accéder au réseau, sans NAT et sans redirection de
2021-09-19 22:19:49 +00:00
port. Les ports alloués par le conteneur ne devront pas entrer en conflit avec
2016-09-15 02:27:59 +00:00
les ports ouverts par la machine hôte.
##### Driver `null`
2016-09-15 02:27:59 +00:00
Avec le driver `null`, la pile réseau est recréée et aucune interface (autre
que l'interface de loopback) n'est présente. Le conteneur ne peut donc pas
accéder à Internet, ni aux autres conteneur, ...
Lorsque l'on exécute un conteneur qui n'a pas besoin d'accéder au réseau, c'est
le driver à utiliser. Par exemple pour un conteneur dont le but est de vérifier
un backup de base de données.
##### Driver `bridge`
2016-09-15 02:27:59 +00:00
2021-09-19 22:19:49 +00:00
Le driver `bridge` crée un nouveau bridge qui sera partagé entre tous les
2016-09-15 02:27:59 +00:00
conteneurs qui la référencent.
Avec cette configuration, les conteneurs ont accès à une résolution DNS des
noms de conteneurs qui partagent leur bridge. Ainsi, sans avoir à utiliser la
fonctionnalité de `link` au moment du `run`, il est possible de se retrouvé
lié, même après que l'on ait démarré. La résolution se fera dynamiquement.
#### Utiliser le `docker-compose.yml`
2016-09-15 02:27:59 +00:00
2017-10-15 22:10:10 +00:00
Consultez
[la documentation](https://docs.docker.com/compose/compose-file/) pour
2017-10-16 01:10:34 +00:00
une liste exhaustive des options que nous pouvons utiliser.
2016-09-15 02:27:59 +00:00
2019-10-16 01:54:56 +00:00
Une fois que notre `docker-compose.yml` est prêt, nous pouvons lancer
la commande suivante et admirer le résultat :
2016-09-14 20:51:14 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
```bash
docker-compose up
2016-09-14 20:51:14 +00:00
```
2017-10-17 06:29:07 +00:00
</div>
2016-09-15 00:46:46 +00:00
Encore une fois, testez la bonne connexion entre chronograf (accessible sur
2017-10-16 01:10:34 +00:00
<http://localhost:8888>) et influxdb.