Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| sysadmin:docker:configuration_reseau [2021/11/01 16:53] – yoann | sysadmin:docker:configuration_reseau [2022/12/12 22:03] (Version actuelle) – Ajout d'un lien référence yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{tag> | + | {{tag> |
| ====== Docker: Configuration réseau des conteneurs ====== | ====== 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. | + | Pour des généralités concernant |
| - | Lorsque | + | |
| + | Initialement Docker possède 3 réseaux. Les réseaux existants peuvent être listés via la commande **'' | ||
| + | |||
| + | ^ bridge | ||
| + | ^ host | Le conteneur utilise la même interface que la machine hôte. A réserver à des usages spécifiques.| | ||
| + | ^ none | Pas de connexion réseau | | ||
| + | |||
| + | ===== Réseau par défaut ===== | ||
| + | |||
| + | Si on crée un conteneur sans spécifier de réseau c'est le réseau **bridge** qui est utilisé. Pour le vérifier: | ||
| + | |||
| + | <code bash> | ||
| + | # création d'un conteneur sans définition concernant le réseau | ||
| + | docker container run --name busybox --rm -it busybox: | ||
| + | |||
| + | # depuis le shell du conteneur, on affiche les interfaces et la passerelle | ||
| + | ip a show | ||
| + | |||
| + | 1: lo: < | ||
| + | link/ | ||
| + | inet 127.0.0.1/8 scope host lo | ||
| + | | ||
| + | 17: eth0@if18: < | ||
| + | link/ether 02: | ||
| + | inet 172.17.0.2/ | ||
| + | | ||
| + | |||
| + | ip route show | ||
| + | |||
| + | default via 172.17.0.1 dev eth0 | ||
| + | 172.17.0.0/ | ||
| + | </ | ||
| + | |||
| + | Le conteneur utilise le réseau 172.17.0.0/ | ||
| + | |||
| + | <code bash> | ||
| + | # Liste des interfaces de la machine hôte | ||
| + | ip addr show | ||
| + | . . . | ||
| + | 6: docker0: < | ||
| + | link/ether 02: | ||
| + | inet 172.17.0.1/ | ||
| + | | ||
| + | inet6 fe80:: | ||
| + | | ||
| + | |||
| + | . . . | ||
| + | </ | ||
| + | |||
| + | Ici on voit que l' | ||
| + | |||
| + | 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. | ||
| + | |||
| + | ===== Spécifier le réseau du conteneur ===== | ||
| + | |||
| + | On peut spécifier le réseau auquel connecter le conteneur via l' | ||
| + | |||
| + | <code bash> | ||
| + | # Ici on isole le conteneur en l' | ||
| + | docker container run --rm -it --name conteneur_test --net=none busybox: | ||
| + | |||
| + | # Equivalent | ||
| + | docker container run --rm -it --name conteneur_test --network none busybox: | ||
| + | / # ip a show | ||
| + | 1: lo: < | ||
| + | link/ | ||
| + | inet 127.0.0.1/8 scope host lo | ||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | Lors 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' | ||
| <code bash> | <code bash> | ||
| + | # Création d'un conteneur en mode interactif | ||
| docker run --interactive --tty --name network_test busybox: | docker run --interactive --tty --name network_test busybox: | ||
| - | # On affiche IP de l' | + | # Shell dans le conteneur |
| - | / # ip a | + | # On affiche IP de l' |
| + | ip addr show | ||
| ... | ... | ||
| 24: eth0@if25: < | 24: eth0@if25: < | ||
| Ligne 18: | Ligne 91: | ||
| | | ||
| - | # on quitte le bash, l' | + | # on quitte le shell, l’exécution |
| exit | exit | ||
| </ | </ | ||
| Ligne 57: | Ligne 130: | ||
| On constate bien qu'une nouvelle interface connecte le conteneur au réseau 172.24.0.0/ | On constate bien qu'une nouvelle interface connecte le conteneur au réseau 172.24.0.0/ | ||
| + | |||
| + | ===== Accès au conteneur depuis l' | ||
| + | |||
| + | Pour accèder au conteneur (et à ses services) depuis l' | ||
| + | On associe des ports libres de l'hote aux ports à l' | ||
| + | |||
| + | <code bash> | ||
| + | # Associe a un port libre de l'hote le port 80 du conteneur | ||
| + | docker run --rm -d --name nginx --publish=80 nginx: | ||
| + | |||
| + | # Associe le port 8080 de l'hote au port 80 du conteneur | ||
| + | docker run --rm -d --name nginx --publish=8080: | ||
| + | </ | ||
| + | |||
| + | ===== Liaison entre conteneurs ===== | ||
| + | |||
| + | Pour faire communiquer des conteneurs en interne, on peut s' | ||
| + | |||
| + | Création d'un conteneur container_server en mode interactif | ||
| + | <code bash> | ||
| + | docker container run -it --rm --name container_server -h server01 busybox: | ||
| + | |||
| + | # Depuis le conteneur, on affiche le nom de la machine | ||
| + | hostname | ||
| + | |||
| + | server01 | ||
| + | </ | ||
| + | |||
| + | On souhaite pouvoir joindre via le réseau interne de Docker le conteneur " | ||
| + | |||
| + | <code bash> | ||
| + | docker container run -it --rm --name container_client -h client01 --link container_server: | ||
| + | |||
| + | # Depuis le shell du conteneur container_client | ||
| + | cat / | ||
| + | |||
| + | 127.0.0.1 | ||
| + | ::1 | ||
| + | fe00::0 ip6-localnet | ||
| + | ff00::0 ip6-mcastprefix | ||
| + | ff02::1 ip6-allnodes | ||
| + | ff02::2 ip6-allrouters | ||
| + | 172.17.0.2 | ||
| + | 172.17.0.3 | ||
| + | </ | ||
| + | |||
| + | Le fichier **/ | ||
| + | |||
| + | < | ||
| + | Selon la façon dont est construite l' | ||
| + | </ | ||
| + | |||
| + | ===== Nommage des interfaces ===== | ||
| + | |||
| + | Lorsque qu'un nouveau réseau est créé via la commande **docker network** ou via **docker-compose**, | ||
| + | |||
| + | <code bash> | ||
| + | # liste les réseau existants | ||
| + | docker network list | ||
| + | NETWORK ID | ||
| + | ... | ||
| + | 44f93d295888 | ||
| + | |||
| + | # liste les interfaces réseaux: | ||
| + | ip link show | ||
| + | 1: lo: < | ||
| + | link/ | ||
| + | ... | ||
| + | 25: br-44f93d295888: | ||
| + | link/ether 02: | ||
| + | </ | ||
| + | |||
| + | Dans exemple ci-dessus, le réseau docker d' | ||
| + | |||
| + | Pour plus de clarté, ou si on souhaite fixer le nom de l' | ||
| + | |||
| + | Depuis la ligne de commande: | ||
| + | |||
| + | <code bash> | ||
| + | docker network create --opt com.docker.network.bridge.name=br_test test-net | ||
| + | </ | ||
| + | |||
| + | Depuis un fichier docker-compose: | ||
| + | <file YAML> | ||
| + | networks: | ||
| + | test-net: | ||
| + | driver: bridge | ||
| + | ipam: | ||
| + | | ||
| + | | ||
| + | - subnet: 172.100.0.0/ | ||
| + | driver_opts: | ||
| + | com.docker.network.bridge.name: | ||
| + | </ | ||
| + | |||
| + | ===== Définir l' | ||
| + | |||
| + | Il est possible d' | ||
| + | |||
| + | <file YAML> | ||
| + | version: " | ||
| + | |||
| + | networks: | ||
| + | vnet: | ||
| + | driver: bridge | ||
| + | ipam: | ||
| + | config: | ||
| + | - subnet: 172.24.0.0/ | ||
| + | gateway: 172.24.0.1 | ||
| + | |||
| + | services: | ||
| + | srv_1: | ||
| + | ... | ||
| + | networks: | ||
| + | vnet: | ||
| + | ipv4_address: | ||
| + | </ | ||
| ===== Création d' | ===== Création d' | ||
| Ligne 82: | Ligne 272: | ||
| </ | </ | ||
| - | Dans l' | + | Dans l' |
| - | ===== Domaine de recherche | + | <code bash> |
| + | $ docker container run --rm --interactive --tty --network vnet-monitoring busybox: | ||
| + | / # ping node-exporter | ||
| + | PING node-exporter (172.24.0.4): | ||
| + | 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, | ||
| + | round-trip min/ | ||
| - | Il est possible de spécifier un ou plusieurs domaines de recherche pour les noms de machine non pleinement qualifiés. | + | / # 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 | ||
| + | </ | ||
| - | En ligne de commande via les | + | ===== Peuplement du fichier /etc/host ===== |
| + | |||
| + | :TODO: : | ||
| + | |||
| + | https:// | ||
| + | |||
| + | ===== Résolution | ||
| + | |||
| + | Les conteneurs qui utilisent la connexion réseau par défaut (default bridge) | ||
| + | |||
| + | <code bash> | ||
| + | # Affiche | ||
| + | cat / | ||
| + | search phobos.lan | ||
| + | nameserver 192.168.33.254 | ||
| + | |||
| + | # Création d'un conteneur temporaire en mode interactif | ||
| + | # avec une connexion par défaut | ||
| + | docker container run --rm -it --name test_dns1 busybox: | ||
| + | |||
| + | # Depuis le shell dans le conteneur, on affiche les paramètres DNS | ||
| + | cat / | ||
| + | search phobos.lan | ||
| + | nameserver 192.168.33.254 | ||
| + | </ | ||
| + | |||
| + | Dans l' | ||
| + | |||
| + | Petite particularité pour les hôtes utilisant **systemd-resolved** (cache DNS local), c'est le fichier ''/ | ||
| + | |||
| + | Pour définir quels serveurs DNS le conteneur doit utiliser, définir une ou plusieurs fois l' | ||
| + | |||
| + | <code bash> | ||
| + | # crée le conteneur en mode interactif | ||
| + | docker container run -it --rm --name dns_test --dns=" | ||
| + | |||
| + | # Affiche la configuration dns du conteneur | ||
| + | cat / | ||
| + | search private.lan | ||
| + | nameserver 172.24.0.53 | ||
| + | </ | ||
| + | |||
| + | |||
| + | Via le docker-compose en valeur simple | ||
| + | <file YAML> | ||
| + | |||
| + | </ | ||
| + | |||
| + | Via le docker-compose en listes | ||
| + | <file YAML> | ||
| + | </ | ||
| - | Via le docker-compose | + | En revanche, les conteneurs connectés à des réseaux personnalisés utilisent systématiquement le serveur DNS intégré à Docker (adresse 127.0.0.11). **Celui-ci est configurable via la ligne de commande ou le docker-compose |
| + | sources: | ||
| + | * https:// | ||
| + | * https:// | ||
| ===== Références ===== | ===== Références ===== | ||
| Ligne 101: | Ligne 358: | ||
| * https:// | * https:// | ||
| * https:// | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||
| + | * https:// | ||