virli/tutorial/docker-basis/linking.md

139 lines
4.5 KiB
Markdown
Raw Normal View History

2015-10-22 03:25:20 +00:00
\newpage
2016-09-08 01:44:20 +00:00
Lier les conteneurs
===================
2015-10-22 03:25:20 +00:00
2017-10-08 22:08:33 +00:00
Partager des fichiers est une chose, mais ce n'est pas une manière d'échanger
2017-10-16 20:59:22 +00:00
de l'information instantanément : les sockets et le réseau restent plus adaptés
à ce genre d'échanges.
2015-10-22 03:25:20 +00:00
2017-10-08 22:08:33 +00:00
## Les pilotes réseau
2015-10-22 03:25:20 +00:00
2017-10-16 20:59:22 +00:00
Docker propose de base trois pilotes (*drivers*) pour « gérer » cela :
2015-10-22 03:25:20 +00:00
2017-10-16 20:59:22 +00:00
- `none` : pour limiter les interfaces réseau du conteneur à l'interface de
2017-10-08 22:08:33 +00:00
loopback `lo` ;
- `host` : pour partager la pile réseau avec l'hôte ;
- `bridge` : pour créer une nouvelle pile réseau par conteneur et rejoindre un
pont réseau dédié.
Ces trois *drivers* sont instanciés de base dans Docker avec le même nom que
2017-10-16 20:59:22 +00:00
leur pilote. Pour consulter la liste de réseaux utilisables, lancez :
2017-10-08 22:08:33 +00:00
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
42sh$ docker network ls
NETWORK ID NAME DRIVER SCOPE
74cedd3ff385 bridge bridge local
d5d907add6e2 host host local
16b702ed01a0 none null local
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
2017-10-16 20:59:22 +00:00
Par défaut, c'est le réseau `bridge` (de type `bridge`) qui est employé : ce
réseau utilise le pont `docker0` que vous pouvez voir dans vos interfaces
réseau via `ip link`. C'est via ce pont que les conteneurs peuvent avoir accès
à Internet, au travers d'une couche de NAT.
2017-10-08 22:08:33 +00:00
Pour changer le réseau principal joint par le conteneur, utiliser l'option
`--network` du `docker container run`.
### Le réseau `host`
En utilisant ce réseau, vous abandonnez tout isolation sur cette partie du
conteneur et partagez donc avec l'hôte toute sa pile IP. Cela signifie, entre
autre, que les ports que vous chercherez à allouer dans le conteneur devront
être disponibles dans la pile de l'hôte et également que tout port allouer sera
directement accessible, sans avoir à utiliser l'option `-p` du `run`.
### Créer un nouveau réseau `bridge`
2017-10-16 20:59:22 +00:00
Afin de contrôler quels échanges peuvent être réalisé entre les conteneurs, il
2017-10-08 22:08:33 +00:00
est recommandé de créer des réseaux utilisateur.
La création d'un réseau se fait tout simplement au travers des sous-commandes
relatives aux objets Docker `network` :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
docker network create --driver bridge my_network
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
C'est ensuite ce nom de réseau que vous passerez à l'option `--network` de vos
`run`, ou vous pouvez également faire rejoindre un conteneur déjà lancé à un
réseau :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
docker network connect NETWORK CONTAINER
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
2017-10-16 20:59:22 +00:00
Lorsque plusieurs conteneurs ont rejoints un réseau utilisateur, ils peuvent
2017-10-08 22:08:33 +00:00
mutuellement se découvrir grâce à un système de résolution de nom basé sur leur
nom de conteneur.
### Exercice
Lancez votre serveur web avec :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
docker container run --name helloapp -d my_webserver
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
Puis créez un réseau utilisateur, rejoignez-le et lancez un conteneur dans le
même réseau utilisateur. Vous devriez être capable de lancer dans ce conteneur
les commandes :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
ping helloapp
curl http://helloapp/
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
## Liaison à l'ancienne
Les réseaux utilisateurs sont la manière à privilégier lorsque l'on souhaite
que deux conteneurs puissent discuter entre-eux.
Avant que cela n'existe, une fonctionnalité de liaison existait. Moins
puissante que les réseaux et plus contraignante car elle nécessite de gérer
l'ordre dans lequel les conteneurs sont lancés, elle permet néanmoins de
partager en plus les variables d'environnements du conteneur lié.
Par exemple, pour lancer un conteneur `postgresql`, il faut lui préciser au
moins le mot de passe à utiliser via la variable d'environnement
`POSTGRES_PASSWORD`[^storepostgres] :
[^storepostgres]: l'ensemble des variables que peut prendre le conteneur est
2017-10-16 20:59:22 +00:00
disponible sur la page dédiée à l'image sur le *store* :
2017-10-08 22:08:33 +00:00
<https://store.docker.com/images/postgres>
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
```
2017-10-17 06:29:07 +00:00
</div>
2017-10-08 22:08:33 +00:00
Le lien permet de fournir à n'importe quel autre conteneur les mêmes variables
d'environnement. Cela évite d'avoir à recopier le mot de passe pour lancer un
conteneur qui en dépendrait. Comme par exemple dans le cas d'un serveur web qui
doit se connecter à une base de données : l'application doit être configurée
pour utiliser le mot de passe défini au lancement du conteneur de base de
données :
2017-10-17 06:29:07 +00:00
<div lang="en-US">
2017-10-08 22:08:33 +00:00
```
docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres
```
2017-10-17 06:29:07 +00:00
</div>