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
2019-10-16 01:54:56 +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
2020-09-21 21:48:16 +00:00
version: "3.8"
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
2016-09-15 02:27:59 +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
2016-09-15 02:27:59 +00:00
### `services`
Cette section énumère la liste des services (ou conteneurs) qui seront gérés
par `docker-compose`.
Il 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`.
Les autres fils sont les paramètres classiques que l'on va passer à `docker
run`.
### `volumes`
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`
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
que les conteneur puisse accéder à l'Internet. Mais ce n'est pas le seul mode
possible !
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`
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
port. Les ports alloués par le conteneur ne devront pas entrer en conflits avec
les ports ouverts par la machine hôte.
#### Driver `null`
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`
Le driver `bridge` crée un nouveau bridge qui sera partagée entre tous les
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`
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.