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
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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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 :
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 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>400 Bad Request</title> </head><body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<br /> </p> </body></html> 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
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.