virli/tutorial/docker-basis/linking.md

4.3 KiB

\newpage

Lier les conteneurs

Partager des fichiers est une chose, mais ce n'est pas une manière d'échanger de l'information de manière instantanée : les sockets et le réseau restent plus adaptés à ce genre d'échanges.

Les pilotes réseau

Docker propose de base trois drivers pour « gérer » cela :

  • none : pour limiter les interfaces réseaux 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, utilisez :

42sh$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
74cedd3ff385        bridge              bridge              local
d5d907add6e2        host                host                local
16b702ed01a0        none                null                local

Par défaut, c'est le réseau bridge (utilisant le pilote bridge) qui est utilisé : ce réseau utilise le pont docker0 que vous pouvez voir dans vos interfaces réseaux via ip link. C'est via ce pont que les conteneurs peuvent avoir accès à Internet, au travers 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éaliser 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 :

docker network create --driver bridge my_network

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 :

docker network connect NETWORK CONTAINER

Lorsque plusieurs conteneurs ont rejoint 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 :

docker container run --name helloapp -d my_webserver

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 :

ping helloapp
curl http://helloapp/

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_PASSWORD1 :

docker container run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres

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 :

docker run -it --rm --link some-postgres:postgres postgres psql -h postgres -U postgres

  1. l'ensemble des variables que peut prendre le conteneur est disponible sur la page dédié à l'image sur le store : https://store.docker.com/images/postgres ↩︎