Outils pour utilisateurs

Outils du site


sysadmin:docker:configuration_reseau

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
sysadmin:docker:configuration_reseau [2022/01/20 10:50] – Ajour lien interne yoannsysadmin:docker:configuration_reseau [2022/12/12 22:03] (Version actuelle) – Ajout d'un lien référence yoann
Ligne 1: Ligne 1:
-{{tag>sysadmin netadmin docker network réseau todo}}+{{tag>sysadmin netadmin docker network réseau}}
  
 ====== Docker: Configuration réseau des conteneurs ====== ====== Docker: Configuration réseau des conteneurs ======
Ligne 5: Ligne 5:
 Pour des généralités concernant la conception et la gestion des réseaux avec Docker voir la note [[sysadmin:docker:concepts_et_philosophie_gestion_reseau]]. Pour des généralités concernant la conception et la gestion des réseaux avec Docker voir la note [[sysadmin:docker:concepts_et_philosophie_gestion_reseau]].
  
-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.+Initialement Docker possède 3 réseaux. Les réseaux existants peuvent être listés via la commande **''docker network ls''**. Succinctement on peut dire: 
 + 
 +^ bridge  | Réseau utilisé par défaut pour les conteneurs. 
 +^ 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:latest /bin/sh 
 + 
 +# depuis le shell du conteneur, on affiche les interfaces et la passerelle 
 +ip a show 
 + 
 +1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 
 +    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
 +    inet 127.0.0.1/8 scope host lo 
 +       valid_lft forever preferred_lft forever 
 +17: eth0@if18: <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 
 + 
 +ip route show 
 + 
 +default via 172.17.0.1 dev eth0  
 +172.17.0.0/16 dev eth0 scope link  src 172.17.0.2  
 +</code> 
 + 
 +Le conteneur utilise le réseau 172.17.0.0/16, il a l'adresse 172.17.0.2 et contacte la passerelle 172.17.0.1 pour joindre tout autre réseau. Si on affiche les interfaces de la machine hôte exécutant Docker Engine, on peut voir une interface nommée **docker0**: 
 + 
 +<code bash> 
 +# Liste des interfaces de la machine hôte 
 +ip addr show 
 +. . . 
 +6: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default  
 +    link/ether 02:42:f5:c5:d5:9d 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:f5ff:fec5:d59d/64 scope link  
 +       valid_lft forever preferred_lft forever 
 + 
 +. . . 
 +</code> 
 + 
 +Ici on voit que l'interface **docker0** à l'adresse 172.17.0.1, c'est donc la **passerelle du réseau par défaut bridge**. 
 + 
 +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'argument **%%--net%%** ou **%%--network%%**: 
 + 
 +<code bash> 
 +# Ici on isole le conteneur en l'associant au réseau none 
 +docker container run --rm -it --name conteneur_test --net=none busybox:latest /bin/sh 
 + 
 +# Equivalent 
 +docker container run --rm -it --name conteneur_test --network none busybox:latest /bin/sh 
 +/ # ip a show 
 +1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 
 +    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
 +    inet 127.0.0.1/8 scope host lo 
 +       valid_lft forever preferred_lft forever 
 +</code> 
 + 
 + 
 +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'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.
  
 <code bash> <code bash>
Ligne 61: Ligne 130:
  
 On constate bien qu'une nouvelle interface connecte le conteneur au réseau 172.24.0.0/16 On constate bien qu'une nouvelle interface connecte le conteneur au réseau 172.24.0.0/16
 +
 +===== Accès au conteneur depuis l'extérieur =====
 +
 +Pour accèder au conteneur (et à ses services) depuis l'extérieur du réseau dans lequel il est confiné, Docker permet de crééer des translations par port ou **PAT**((**P**ort **A**ddress **T**ranslation)).
 +On associe des ports libres de l'hote aux ports à l'écoute des conteneurs via le paramètre **%%--publish%%**:
 +
 +<code bash>
 +# Associe a un port libre de l'hote le port 80 du conteneur
 +docker run --rm -d --name nginx --publish=80 nginx:alpine
 +
 +# Associe le port 8080 de l'hote au port 80 du conteneur
 +docker run --rm -d --name nginx --publish=8080:80 nginx:alpine
 +</code>
 +
 +===== Liaison entre conteneurs =====
 +
 +Pour faire communiquer des conteneurs en interne, on peut s'appuyer sur les liaisons en utilisant l'option **%%--link%%**.
 +
 +Création d'un conteneur container_server en mode interactif
 +<code bash>
 +docker container run -it --rm --name container_server -h server01 busybox:latest /bin/sh
 +
 +# Depuis le conteneur, on affiche le nom de la machine
 +hostname
 +
 +server01
 +</code>
 +
 +On souhaite pouvoir joindre via le réseau interne de Docker le conteneur "container_server". Pour cela lors de la création du conteneur client on utilise l'option **%%--link conteneur_a_joindre:alias%%**:
 +
 +<code bash>
 +docker container run -it --rm --name container_client -h client01 --link container_server:server busybox:latest /bin/sh 
 +
 +# Depuis le shell du conteneur container_client
 +cat /etc/hosts 
 +
 +127.0.0.1       localhost
 +::1     localhost ip6-localhost ip6-loopback
 +fe00::0 ip6-localnet
 +ff00::0 ip6-mcastprefix
 +ff02::1 ip6-allnodes
 +ff02::2 ip6-allrouters
 +172.17.0.2      server server01 container_server
 +172.17.0.3      client01
 +</code>
 +
 +Le fichier **/etc/hosts** du client est alors complété avec l'IP du conteneur serveur, et les noms associés.
 +
 +<note>
 +Selon la façon dont est construite l'image du conteneur auquel on s'est lié (notamment via la directive EXPOSE du dockerfile) on peut également retrouver des informations concernant l'adresse du conteneur, les ports et les protocoles exposés dans les variables environnement.
 +</note>
  
 ===== Nommage des interfaces ===== ===== Nommage des interfaces =====
Ligne 173: Ligne 293:
 </code> </code>
  
 +===== Peuplement du fichier /etc/host =====
 +
 +:TODO: :TODO_DOCUPDATE:
 +
 +https://runebook.dev/fr/docs/docker/engine/reference/run/index
  
 ===== Résolution de nom ===== ===== Résolution de nom =====
Ligne 234: Ligne 359:
   * https://docs.docker.com/compose/compose-file/compose-file-v3/#aliases   * https://docs.docker.com/compose/compose-file/compose-file-v3/#aliases
   * https://stackoverflow.com/questions/39493490/provide-static-ip-to-docker-containers-via-docker-compose   * https://stackoverflow.com/questions/39493490/provide-static-ip-to-docker-containers-via-docker-compose
 +  * https://linuxconfig.org/basic-example-on-how-to-link-docker-containers
 +  * https://runebook.dev/fr/docs/docker/engine/reference/run/index
 +  * https://kerneltalks.com/networking/how-docker-container-dns-works/
  
sysadmin/docker/configuration_reseau.1642675859.txt.gz · Dernière modification : 2022/01/20 10:50 de yoann