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/