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/12/28 11:35] – 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 ===== | ===== Nommage des interfaces ===== | ||
Ligne 99: | Ligne 223: | ||
driver_opts: | driver_opts: | ||
com.docker.network.bridge.name: | 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: | ||
</ | </ | ||
Ligne 146: | Ligne 293: | ||
</ | </ | ||
- | ===== Domaine de recherche | + | ===== Peuplement du fichier / |
- | Il est possible de spécifier un ou plusieurs domaines de recherche pour les noms de machine non pleinement qualifiés. | + | :TODO: : |
- | En ligne de commande via les | + | 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 162: | Ligne 358: | ||
* https:// | * https:// | ||
* https:// | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||
+ | * https:// | ||