Ceci est une ancienne révision du document !
Par défaut le conteneur se voit attribuer une adresse IP pour chaque réseau auquel il est connecté. Le daemon Docker agit à la manière d'un serveur DHCP et fournit une IP dans le pool réservé au réseau. Chaque réseau à son propre masque et sa passerelle par défaut.
Lorsque de sa création, le conteneur ne peut être connecté qu'à un seul réseau. Celui-ci peut être définit sur la ligne de commande via l'option --network. On peut également spécifier une adresse IP via les options --ip ou --ip6. Si rien n'est spécifié, un réseau dédié est créé pour le conteneur.
docker run --interactive --tty --name network_test busybox:latest /bin/sh # On affiche IP de l'interface créée par défaut / # ip a ... 24: eth0@if25: <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 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever # on quitte le bash, l'execution du conteneur est stoppée exit
Afficher les paramètres réseau actuels du conteneur network_test
:
docker container inspect --format "{{json .NetworkSettings}}" network_test | jq
On redémarre le conteneur et on le connecte à un réseau docker supplémentaire existant sur l’hôte. Ici pour l'exemple vnet-monitoring
# Démarrer le conteneur qui rejoint son réseau par défaut docker container start network_test # Connecter le conteneur sur un autre réseau, ici vnet-monitoring docker network connect vnet-monitoring network_test
On ouvre un shell dans le conteneur pour afficher les paramètres réseau
docker container exec --interactive network_test /bin/sh ip a ... 26: eth0@if27: <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 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever 28: eth1@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:18:00:04 brd ff:ff:ff:ff:ff:ff inet 172.24.0.4/16 brd 172.24.255.255 scope global eth1 valid_lft forever preferred_lft forever
On constate bien qu'une nouvelle interface connecte le conteneur au réseau 172.24.0.0/16
Lorsque qu'un nouveau réseau est créé via la commande docker network ou via docker-compose, un nom générique est attribué pour la nouvelle interface virtuelle créée sur le système. Ce nom est en général de la forme br-xxxxxxxxxxxx le suffixe correspondant au hash du réseau.
# liste les réseau existants docker network list NETWORK ID NAME DRIVER SCOPE ... 44f93d295888 webadmin_vnet bridge local # liste les interfaces réseaux: ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 ... 25: br-44f93d295888: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:00:07:2e:f8 brd ff:ff:ff:ff:ff:ff
Dans exemple ci-dessus, le réseau docker d'identifiant 44f93d295888 correspond à l'interface br-44f93d295888 du système.
Pour plus de clarté, ou si on souhaite fixer le nom de l'interface (utile pour définir des règles iptables) il est possible de spécifier le nom de l'interface.
Depuis la ligne de commande:
docker network create --opt com.docker.network.bridge.name=br_test test-net
Depuis un fichier docker-compose:
networks: test-net: driver: bridge ipam: driver: default config: - subnet: 172.100.0.0/16 driver_opts: com.docker.network.bridge.name: br_test
Il est possible d'attribuer une adresse IP statique au conteneur:
version: "3.3" networks: vnet: driver: bridge ipam: config: - subnet: 172.24.0.0/16 gateway: 172.24.0.1 services: srv_1: ... networks: vnet: ipv4_address: 172.24.0.10
Les alias permettent de définir des noms d’hôtes alternatifs via lesquels un service pourra être atteint au sein d'un réseau.
version: "3.3" networks: vnet-monitoring: external: name: vnet-monitoring services: node-exporter: image: prom/node-exporter:v1.2.2 container_name: node-exporter restart: unless-stopped environment: {} networks: vnet-monitoring: aliases: - localnode
Dans l'exemple ci-dessus, le service node-exporter
est inséré dans le réseau externe vnet-monitoring
. Au sein de se réseau, on pourra communiquer avec le service node-exporter en le désignant indifféremment node-exporter
ou localnode
.
$ docker container run --rm --interactive --tty --network vnet-monitoring busybox:latest / # ping node-exporter PING node-exporter (172.24.0.4): 56 data bytes 64 bytes from 172.24.0.4: seq=0 ttl=64 time=0.165 ms 64 bytes from 172.24.0.4: seq=1 ttl=64 time=0.196 ms 64 bytes from 172.24.0.4: seq=2 ttl=64 time=0.178 ms ^C --- node-exporter ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.165/0.179/0.196 ms / # ping localnode PING localnode (172.24.0.4): 56 data bytes 64 bytes from 172.24.0.4: seq=0 ttl=64 time=0.223 ms 64 bytes from 172.24.0.4: seq=1 ttl=64 time=0.201 ms
Il est possible de spécifier un ou plusieurs domaines de recherche pour les noms de machine non pleinement qualifiés.
En ligne de commande via les
Via le docker-compose