Outils pour utilisateurs

Outils du site


sysadmin:docker:configuration_reseau

Ceci est une ancienne révision du document !


Docker: Configuration réseau des conteneurs

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

Nommage des interfaces

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

Création d'alias

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

Domaine de recherche

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

Références

sysadmin/docker/configuration_reseau.1640691312.txt.gz · Dernière modification : 2021/12/28 11:35 de yoann