139 lines
4.5 KiB
Markdown
139 lines
4.5 KiB
Markdown
\newpage
|
|
|
|
Lier les conteneurs
|
|
===================
|
|
|
|
Partager des fichiers est une chose, mais ce n'est pas une manière d'échanger
|
|
de l'information instantanément : les sockets et le réseau restent plus adaptés
|
|
à ce genre d'échanges.
|
|
|
|
## Les pilotes réseau
|
|
|
|
Docker propose de base trois pilotes (*drivers*) pour « gérer » cela :
|
|
|
|
- `none` : pour limiter les interfaces réseau du conteneur à l'interface de
|
|
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
|
|
leur pilote. Pour consulter la liste de réseaux utilisables, lancez :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
42sh$ docker network ls
|
|
NETWORK ID NAME DRIVER SCOPE
|
|
74cedd3ff385 bridge bridge local
|
|
d5d907add6e2 host host local
|
|
16b702ed01a0 none null local
|
|
```
|
|
</div>
|
|
|
|
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.
|
|
|
|
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`
|
|
|
|
Afin de contrôler quels échanges peuvent être réalisé entre les conteneurs, il
|
|
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` :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
docker network create --driver bridge my_network
|
|
```
|
|
</div>
|
|
|
|
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 :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
docker network connect NETWORK CONTAINER
|
|
```
|
|
</div>
|
|
|
|
Lorsque plusieurs conteneurs ont rejoints un réseau utilisateur, ils peuvent
|
|
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 :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
docker container run --name helloapp -d my_webserver
|
|
```
|
|
</div>
|
|
|
|
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 :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
ping helloapp
|
|
curl http://helloapp/
|
|
```
|
|
</div>
|
|
|
|
|
|
## 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
|
|
disponible sur la page dédiée à l'image sur le *store* :
|
|
<https://store.docker.com/images/postgres>
|
|
|
|
<div lang="en-US">
|
|
```
|
|
docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
|
|
```
|
|
</div>
|
|
|
|
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 :
|
|
|
|
<div lang="en-US">
|
|
```
|
|
docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres
|
|
```
|
|
</div>
|