Utiliser le réseau Docker et la propriété extra_hosts
Résolvez les alias d'hôte dans vos containers Docker ! Apprenez à utiliser docker network et la propriété extra_hosts dans docker compose pour connecter vos services sans friction.
Traduction automatique
Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Cet article explique pourquoi un container Docker ne peut pas en joindre un autre si les deux ne tournent pas sur le même réseau Docker. On y crée un réseau partagé, on récupère l'IP de sa gateway avec docker network inspect, puis on y connecte un second container via compose.yaml. Il montre aussi comment réutiliser, dans un container, un alias défini dans le fichier hosts de la machine hôte grâce à la propriété extra_hosts.
Quand vous lancez un container Docker sur un réseau différent du réseau standard (appelé bridge) et que vous souhaitez lancer un second container qui doit accéder au premier, vous devez lancer ce second container sur le même réseau.
Imaginons que vous fassiez tourner une base de données MySQL sur un réseau appelé my_network et que vous vouliez démarrer un second container comme phpMyAdmin (voir Utiliser Adminer, pgadmin ou phpmyadmin pour accéder à votre container de base de données Docker) pour accéder à la base : vous devez alors utiliser l'option CLI --network au moment de lancer le second container avec docker run.
Maintenant, imaginez que le premier container soit une application web et que le second doive pouvoir accéder à sa page web, et en plus réutiliser le même alias ?
Le correctif en deux lignes
Voici toute la réponse, en début d'article plutôt qu'à la fin. Ajoutez extra_hosts au service qui doit joindre votre alias d'hôte :
services: my_second_container: build: context: . networks: - my_network //highlight-next-line extra_hosts: //highlight-next-line - "my_site.local:172.20.0.1"
networks: my_network: external: trueCe fichier Docker Compose définit un service conteneur nommé my_second_container qui se construit à partir du répertoire courant, se connecte à un réseau existant appelé my_network, et ajoute une entrée DNS locale pour mapper my_site.local à l'adresse IP 172.20.0.1.
Entrez dans le container et regardez ce que Docker en a fait :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
[...]
L'alias my_site.local est maintenant une vraie ligne dans le /etc/hosts du container, et curl http://my_site.local:8080 renvoie la page servie par l'autre container.
Pourquoi ça marche
- Les deux containers doivent partager un réseau. Un container sur le réseau
bridgepar défaut ne peut tout simplement pas joindre un container qui tourne sur un autre réseau — c'est une protection, pas un bug. 172.20.0.1est la gateway de ce réseau, c'est-à-dire l'adresse depuis laquelle les containers voient votre machine hôte. C'est la valeur que nous allons récupérer plus bas avecdocker network inspect.- Le fichier hosts de votre machine hôte est invisible depuis l'intérieur d'un container.
extra_hostsest le moyen de redéclarer l'alias là où le container peut le voir : Docker écrit la ligne dans/etc/hostsau démarrage.
Le reste de cet article construit tout le scénario depuis zéro, y compris les deux échecs que vous rencontreriez en chemin.
Un peu de préparation
Passez cette étape si vous avez déjà un réseau dédié et son container qui tourne
Si vous n'avez pas encore d'application web qui tourne sur son propre réseau, suivez cette étape.
Démarrez un shell Linux et lancez mkdir -p /tmp/network && cd $_ pour créer un dossier network dans votre dossier temporaire Linux et vous y placer.
Créez ensuite un fichier index.php dans ce dossier avec ce contenu :
<?php
phpinfo();Ce script PHP affiche des informations détaillées sur la configuration et l'état du serveur PHP actuel, comme la version installée, les extensions chargées et les paramètres de configuration.
Voici le contenu de votre répertoire courant :
Comme il nous faut un réseau Docker, créez-en un :
Et lancez le script avec docker run -d -p 8080:80 -u $(id -u):$(id -g) -v "$PWD":/var/www/html --network my_network php:8.2-apache.
Cette commande démarre un container Apache et nous pouvons surfer sur notre site local via http://127.0.0.1:8080

Créer notre second container
Nous pouvons maintenant créer un second container et essayer simplement de faire un curl vers notre site.
Créez un fichier appelé Dockerfile avec le contenu ci-dessous. Nous utilisons une très petite image Linux et nous y installons curl.
FROM alpine:3.14
RUN apk add --no-cache curlCe Dockerfile crée une image Docker basée sur Alpine Linux 3.14 et installe l'outil curl dedans. Alpine est choisi comme image de base car c'est une distribution très légère, et on ajoute curl pour permettre à des scripts ou applications dans le conteneur de faire des requêtes HTTP.
Et un second fichier appelé compose.yaml avec ce contenu :
services: my_second_container: build: context: .Ce fichier Docker Compose définit un service nommé my_second_container qui sera construit à partir d'une image créée par Docker en utilisant le Dockerfile situé dans le répertoire courant (context: .).
Pour que tout soit clair, voici le contenu de notre répertoire courant :
Nous devons créer notre image. Pour cela, lancez simplement docker compose build.
Nous démarrons ensuite un shell bash interactif dans notre second container et nous essayons d'accéder à notre site local :
Quand ça ne marche pas (et pourquoi)
Ça ne fonctionne pas... **comme prévu**
Nous confirmons que notre container n'arrive pas à accéder à notre site local http://127.0.0.1:8080 alors que ce site est bien configuré. Si vous sortez du container et rafraîchissez le site, tout fonctionne.
Il faut lancer le second container sur le même réseau
Retrouver le réseau utilisé par un container
Si vous ne connaissez pas le nom du réseau utilisé, lancez simplement docker inspect xxxx où xxxx est le nom du container. Vous obtiendrez une réponse JSON avec une entrée Networks. Pour plus d'informations, lisez l'article Docker inspect - Récupérer les informations réseau.
Modifiez votre fichier compose.yaml comme ceci :
services: my_second_container: build: context: . //highlight-next-line networks: //highlight-next-line - my_network
//highlight-next-linenetworks: //highlight-next-line my_network: //highlight-next-line external: trueCe fichier Docker Compose définit un service conteneur appelé my_second_container qui se construit à partir du répertoire courant et se connecte à un réseau existant nommé my_network. Le réseau est déclaré comme externe, ce qui signifie qu'il doit déjà exister dans l'environnement Docker plutôt que d'être créé par Compose.
Remplacez my_network par le vôtre si vous en avez un autre.
Il faut trouver l'IP du réseau
Mais il reste une chose à faire : nous devons obtenir l'adresse IP de la gateway du réseau.
De retour sur votre machine (et pas depuis l'intérieur du container), lancez :
L'IP dont nous avons besoin est 172.20.0.1 (Gateway), comme illustré ci-dessus.
On réessaie
Nous pouvons maintenant réessayer : démarrez à nouveau un shell interactif. Ça ne marchera toujours pas avec l'IP locale 127.0.0.1, mais bien, cette fois, avec l'adresse IP de la gateway du réseau :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<style type="text/css">
body {background-color: #fff; color: #222; font-family: sans-serif;}
pre {margin: 0; font-family: monospace;}
Cas d'usage supplémentaire - les alias
Et maintenant la dernière partie : imaginez que vous ayez défini un alias dans le fichier hosts (sous Windows, dans le fichier C:\Windows\System32\drivers\etc\hosts).
Imaginez que vous ayez créé un alias comme celui-ci :
127.0.0.1 localhost// highlight-next-line127.0.0.1 mysite.localCe fichier hosts configure des alias de noms d'hôtes locaux en redirigeant des domaines vers l'adresse localhost. La ligne 2 est un commentaire spécial utilisé par des outils de documentation ou d'affichage pour marquer la ligne suivante comme importante.
et donc, sur votre machine hôte, vous n'utilisez pas http://127.0.0.1:8080 mais http://mysite.local:8080
Si nous essayons d'y accéder depuis l'intérieur du second container, ça ne fonctionne pas :
Et c'est normal puisque my_site.local est un alias défini sur votre machine hôte, pas dans le container :
La dernière chose à faire dans ce cas est d'éditer notre fichier compose.yaml et d'y ajouter la propriété extra_hosts — les deux lignes montrées tout au début de cet article, cette fois avec l'IP de la gateway récupérée plus haut. Entrez une dernière fois dans le container, faites cat /etc/hosts : l'alias est là, et curl http://my_site.local:8080 fonctionne.
Conclusion
L'alias que vous tapez dans votre navigateur depuis des mois est une affaire de machine hôte. Rien ne le transporte dans un container, et rien ne vous dit que c'est là le problème — vous obtenez juste Could not resolve host et vous commencez à douter de votre réseau. Deux lignes d'extra_hosts pointant vers la gateway du réseau comblent le trou, et votre compose.yaml documente désormais cette dépendance pour la prochaine personne qui clonera le projet.
Quand tout semble correctement configuré et que la connexion échoue quand même, Dépannage des containers Docker - Accéder à l'autre déroule le diagnostic couche par couche.





