Aller au contenu principal

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.

· 8 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Utiliser le réseau Docker et la propriété extra_hosts

⚡
TL;DR

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: true

Ce 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 :

>user@machine: ~/yourproject
<!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 bridge par 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.1 est 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 avec docker network inspect.
  • Le fichier hosts de votre machine hôte est invisible depuis l'intérieur d'un container. extra_hosts est le moyen de redéclarer l'alias là où le container peut le voir : Docker écrit la ligne dans /etc/hosts au 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 :

>user@machine: ~/yourproject

Comme il nous faut un réseau Docker, créez-en un :

>user@machine: ~/yourproject

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

http://127.0.0.1:8080

Notre site local

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 curl

Ce 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 :

>user@machine: ~/yourproject

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 :

>user@machine: ~/yourproject

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-line
networks:
//highlight-next-line
my_network:
//highlight-next-line
external: true

Ce 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 :

>user@machine: ~/yourproject

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 :

>user@machine: ~/yourproject
<!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-line
127.0.0.1 mysite.local

Ce 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

http://mysite.local:8080

Mon site

Si nous essayons d'y accéder depuis l'intérieur du second container, ça ne fonctionne pas :

>user@machine: ~/yourproject

Et c'est normal puisque my_site.local est un alias défini sur votre machine hôte, pas dans le container :

>user@machine: ~/yourproject

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.


Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?