Networking

Accès extérieurs vers un container

Par défaut, les accès extérieurs vers un container ne sont pas autorisés — en revanche, les containers ont accès vers l’extérieur et peuvent effectuer des requêtes Internet.
Pour autoriser les accèss ver le container, il faut exposer explicitement les ports du container au moment où on le crée, en liant le port du container à un port de l’hôte — soit un port spécifique, soit un port disponible choisit aléatoirement par Docker (si le container est arrêté puis redémarré, le port choisit sera vraisemblablement différent)

Exposer des ports

Limiter l’accès à un hôte

0.0.0.0 indique que le container accepte les connexions de n’importe qui.
C’est la valeur par défaut quand on expose un port.
Mais on peut limiter l’accès à une interface spécifique, par exemple uniquement localhost:

docker run -p 127.0.0.1:80:8080/tcp

Très souvent, un service est configuré pour écouter les connexions de la machine locale (127.0.0.0) et non d’Internet. Lorsque ce service est placé dans un container, la machine locale est cantonnée à l’intérieur du container. Pour pouvoir recevoir des connexions du même hôte, mais dans des containers différents, il faut modifier le service pour qu’il écoute toutes les connexions en définissant son adresse à 0.0.0.0 puis utiliser Docker pour limiter l’accès à un seul hôte.

Type de port

Par défaut, quand on entre un numéro de port, Docker part du principe qu’il s’agit d’un port TCP.
On peut préciser le protocole de port utilisé: tcp, udp ou sctp

HOST_PORT:CONTAINER_PORT/PROTOCOL

Réseau Docker

Drivers

Entre les applications et le réseau physique, se trouve le réseau Docker — appelé le Container Network Model (CNM). Le CNM assure la connectivité des containers et offre des fonctionnalités spéciales telles que le mise en réseau multi-hôte, le chiffrement de la couche réseau et la découverte de services.

Derrière la scène, Docker utilise les fonctionnalités Linux: bridges, namespaces réseau, paires veth, iptables.

L’utilisation de ces fonctionnalités est contrôlée par les drivers réseau de Docker — qui fournissent les règles de transfert, la segmentation réseau et les outils de gestion pour gérer le réseau au niveau applicatif. Docker inclut également un driver IPAM (IP Address Management) — qui s’occupe de fournir les adresses IP privée du sous-réseau.

Certains drivers réseau sont directement inclus dans Docker Engine. D’autres sont rendus disponibles par les fournisseurs de réseau et la communauté Docker et peuvent être installés sous forme de plugins.
Les drivers réseau natifs de Docker sont les suivants:

Understanding Docker Networking Drivers and their use cases

Réseau par défaut

Sur tout hôte exécutant Docker Engine, il existe le réseau Docker par défaut, nommé bridge et de type bridge (crée et utilise le bridge Linux docker0). Il s’agit du réseau par défaut, auquel les containers se connectent si aucun réseau n’est spécifié. À l’intérieur du container eth0 est crée par le driver bridge, et une addresse IP lui est assignée par le driver IPAM.

host$ docker run -it --name c1 busybox sh
# ip address
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0

# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0  src 172.17.0.2
host$ ip route
default via 172.31.16.1 dev eth0
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.42.1
172.31.16.0/20 dev eth0  proto kernel  scope link  src 172.31.16.102

Le réseau bridge par défaut utilise le sous-réseau 172.[17-31].0.0/16 ou 192.168.[0-240].0/20.

Lister les réseaux Docker existants

Pour lister tous les réseaux Docker existants:

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1475f03fbecb        bridge              bridge              local
e2d8a4bd86cb        docker_gwbridge     bridge              local
407c477060e7        host                host                local
f4zr3zrswlyg        ingress             overlay             swarm
c97909a4b198        none                null                local

Réseau définit par l’utilisateur

Outre les réseaux par défaut, les utilisateurs peuvent créer leurs propres réseaux Docker. Contrairement au réseau bridge par défaut, les réseaux définis par l’utilisateur prennent en charge l’attribution manuelle des adresses IP et des sous-réseaux.

Se connecter à un réseau donné

Tous les containers d’un même réseau Docker peuvent communiquer entre eux sur tous les ports. Alors que la communication entre différents réseaux et le traffic en entrée pronenant de l’extérieur de Docker sont protégés par un firewall — l’accès externe doit être explicitement autorisé, en exposant des ports.

Use bridge networks

Iptables

Par défaut, Docker ajoutera des règles de transfert à la chaîne de filtres DOCKER de iptables. Il est possible de de désactiver ce comportement en définissant --iptables=false au moment de démarrer le daemon. Il faudra alors ajouter manuellement les règles iptables.

iptables -I DOCKER -i ext_if ! -s 8.8.8.8 -j DROP

Understand container communication


Legacy: Lier deux containers

--link est une fonctionnalité dépreciée, qui sera éventuellement supprimée de Docker.
Lorsqu’on lie deux containers ensemble, on lie tous les ports de manière unidirectionnelle (client -> serveur). Ce qui peut être utile pour un service et un healthcheck par exemple.

Avant --link, on utilisait une fonction dit de linking, qui était très similaire mais fonctionnait en définissant des variables d’environnement à l’intérieur des containers.


DNS

Par défaut, Docker s’occupe du DNS des containers, y compris de populer /etc/hosts et /etc/resolv.conf.