Outils pour utilisateurs

Outils du site


informatique:docker:netdocker

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: <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 :

  • 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
<!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

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.

informatique/docker/netdocker.txt · Dernière modification: 2023/11/23 10:37 par benoit