====== Réseaux sous Docker ====== Quelques commandes. Pour lister les réseaux : docker network ls Exemple de résultat : NETWORK ID NAME DRIVER SCOPE a5058156ace7 bridge bridge local 308d0f7c3659 host host local 499ff58d4934 none null local Pour avoir les détails sur les caractéristiques d'une des réseaux (par exemple le réseau Bridge) : docker network inspect a5058156ace7 ===== Mode Bridge (Par défaut) ===== Par défaut Docker fonctionne en mode Bridge. Ci-dessous, quelques commandes pour comprendre le comportement. L'IP locale 172.17.0.1/16 est définie par défaut. Cette IP sera utilisé comme passerelle par défaut pour tous les conteneurs que nous démarrerons. ip a show docker0 Exemple de résultat : 3: docker0: mtu 1500 qdisc noqueue state UP group default link/ether 02:42:ef:43:f6:39 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:efff:fe43:f639/64 scope link valid_lft forever preferred_lft forever Par exemple, démarrons un conteneur ''httpd'' : docker run --name c1 -d httpd Nous pouvons voir que par défaut ce conteneur écoute sur le port 80 : docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d42852ccd99f httpd "httpd-foreground" 3 seconds ago Up 2 seconds 80/tcp c1 Ci-dessous, nous récupérons l'adresse IP de notre conteneur, son port d'exposition et sa passerelle par défaut : docker inspect -f '{{.NetworkSettings.IPAddress}} {{.NetworkSettings.Ports}} {{.NetworkSettings.Gateway}}' c1 Résultat : 172.17.0.2 map[80/tcp:[]] 172.17.0.1 Notre conteneur c1 a les caractéristiques suivantes : * Son IP est **172.17.0.2** * Il écoute sur le **port 80** * Sa passerelle par défaut est **172.17.0.1** Notre hôte docker ''172.17.0.1'' peut donc interagir avec via le réseau sur le conteneur ''172.17.0.2:80''. Exemple : telnet 172.17.0.2 80 Trying 172.17.0.2... Connected to 172.17.0.2. Escape character is '^]'. get / HTTP/1.1 400 Bad Request Date: Mon, 20 Nov 2023 07:33:33 GMT Server: Apache/2.4.58 (Unix) Content-Length: 226 Connection: close Content-Type: text/html; charset=iso-8859-1 400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.

Connection closed by foreign host. Cependant, le port 80 du conteneur n'est accessible que par la machine hôte. Une machine externe, ne pourra pas interagir sur le port 80 de notre conteneur. Il faut donc publier le port 80 sur un port disponible de notre hôte. Nous allons supprimer le conteneur et en créer un nouveau que nous allons publier sur le port 80 du conteneur sur le port 8080 de notre hôte : docker rm -f c1 docker run --name c1 -p 8080:80 -d httpd Cette fois nous pouvons voir que notre conteneur écoute sur le port 80 et que celui-ci est publié sur le port 8080 de notre machine : docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3bda19ffc15 httpd "httpd-foreground" 4 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp c1 Pour créer un réseau Bridge nommé ''mynet0'' autre que celui par défaut : docker network create --driver=bridge --subnet=192.168.0.0/24 mynet0 on peut ajouter une option pour que l'interface sur l'hôte se nomme aussi ''mynet0'' : docker network create --driver=bridge --subnet=192.168.0.0/24 -o com.docker.network.bridge.name="mynet0" mynet0 Pour lancer un conteneur qui utilisera ce réseau : docker run -d --name c1 --network mynet0 httpd On peut aussi connecter un conteneur déjà en fonctionnement d'un autre réseau ou réseau par défaut. Ci-dessous, on va démarrer un conteneur dans le réseau par défaut, puis le connecter également à notre réseau ''mynet0'' : docker run -d --name c2 httpd docker network connect mynet0 c2 Le conteneur ''c2'' est donc connecté au réseau ''bridge'' par défaut et réseau ''mynet0'', vérifié par : docker inspect c2 ===== Mode Host ===== Le mode ''host'' bypass le port mapping du mode ''bridge''. On démarre de conteneur en mode host. docker run --name c3 -d --network host httpd Le port 80 de la machine écoutera directement sur l'hôte. Sauf vraiment cas spécifique, il est mieux d'éviter d'utiliser ce type de réseau.