Réseaux multi hôtes pour Docker

 

Quand on commence à déployer des conteneurs sur des clusters Swarm on rencontre une problématique sur la communication réseau entre des conteneurs déployés sur différentes machines. La solution est de mettre en place un réseau commun entre les hôtes, c'est ce qu'on appelle un réseau overlay.

Un réseau overlay est un réseaux multi hôtes pour Docker, ce qui permet de faire communiquer les conteneurs sur un réseau "interne" commun. Il est bien sûr possible de créer plusieurs réseaux overlay.

Cependant pour mettre en place ce type de réseau, il faut mettre en place un serveur de gestion de clé-valeur. La libkv de Docker supporte Consul, Etcd et Zookeeper.

Réellement pour le moment je sais pas lequel est le plus intéressant ou la différence entre chaque, j'ai donc choisi une installation avec Consul.

On va utiliser ce qu'on à déjà vu avec Docker Swarm

 

Installation de Consul

Une première machine sur laquelle on va faire tourner le service consul

$ docker-machine create -d openstack --openstack-flavor-name="vps-ssd-1" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" dockkv

Installation d'un contener consul sur la machine dockkv :

$ docker $(docker-machine config dockkv) run -d -p 8500:8500 -h consul -name consul progrium/consul -server -bootstrap

 

Création du cluster swarm

Le swarm master

$ docker-machine create -d openstack --openstack-flavor-name="vps-ssd-2" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-master --swarm-discovery="consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-store=consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-advertise=eth0:2376" dock00

Machines swarm

$ docker-machine create -d openstack --openstack-flavor-name="vps-ssd-2" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery="consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-store=consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-advertise=eth0:2376" dock01

$ docker-machine create -d openstack --openstack-flavor-name="vps-ssd-2" --openstack-image-name="Debian 8"  --openstack-net-name="Ext-Net" --openstack-ssh-user="admin" --swarm --swarm-discovery="consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-store=consul://$(docker-machine ip dockkv):8500" --engine-opt="cluster-advertise=eth0:2376" dock02

Création de réseaux overlay

$ docker network create -d overlay netw01

 

Tester

On charge l'environnement pour le swarm master

$ eval "$(docker-machine env --swarm dock00)"

Déployer des conteneurs :

$ docker run -d --name web01 --net netw01 nginx
$ docker run -d --name web012 --net netw01 nginx
$ docker run -d --name web013 --net netw01 nginx

Lister les conteneurs sur le cluster

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
6db4c16e52f8        nginx               "nginx -g 'daemon off"   4 seconds ago        Up 3 seconds        80/tcp, 443/tcp     dock02/web013
c56f19700b9c        nginx               "nginx -g 'daemon off"   15 seconds ago       Up 14 seconds       80/tcp, 443/tcp     dock00/web012
8b2ce1dcf37d        nginx               "nginx -g 'daemon off"   About a minute ago   Up About a minute   80/tcp, 443/tcp     dock02/web01

On se connecte sur un des conteneurs :

$ docker exec -it web01 bash
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
19: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
link/ether 02:42:0a:00:00:03 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.3/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:aff:fe00:3/64 scope link
valid_lft forever preferred_lft forever

# ping web012
PING web012 (10.0.0.5): 56 data bytes
64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=0.738 ms

Magique  non ?


Sources

https://medium.com/on-docker/docker-overlay-networks-that-was-easy-8f24baebb698#.oies3h75f
https://docs.docker.com/engine/userguide/networking/dockernetworks/