Pourquoi deux conteneurs doivent parfois se parler

Une application réelle est rarement seule : elle a souvent besoin d'une base de données, d'un cache, ou d'un autre service annexe, qui tourne lui-même dans son propre conteneur, isolé du premier. Pour illustrer ce guide, vous allez utiliser Redis, un petit service de stockage en mémoire très répandu, que Mini-Carnet retrouvera au guide 24 pour y stocker son compteur de visites autrement qu'avec un fichier.

Deux conteneurs distincts, chacun isolé par défaut comme vu au guide 16 pour les ports, ne se voient pas spontanément. Un mécanisme est nécessaire pour qu'ils puissent se contacter l'un l'autre.

Le réseau par défaut a une vraie limite

Docker place chaque conteneur, sans autre indication, sur un réseau appelé le réseau par défaut. Sur ce réseau, deux conteneurs peuvent techniquement communiquer, mais uniquement par adresse IP, jamais par leur nom. Or une adresse IP de conteneur peut changer d'une exécution à l'autre : s'appuyer dessus rendrait toute configuration fragile.

La solution : un réseau personnalisé

Créez un réseau avec docker network create, puis démarrez Redis dessus, avec un nom explicite :

redis:alpine est l'image officielle Redis, en variante allégée. --network mini-carnet-net place ce conteneur sur le réseau que vous venez de créer, sous le nom redis.

Vérifier que le nom fonctionne réellement

Lancez maintenant un second conteneur temporaire, sur le même réseau, pour interroger Redis en utilisant simplement son nom :

--rm supprime automatiquement ce conteneur temporaire une fois sa commande terminée, pratique pour un simple test. -h redis indique à redis-cli de contacter l'hôte nommé redis, exactement le nom donné plus haut au conteneur Redis. La réponse PONG confirme que ce conteneur a bien réussi à en joindre un autre par son nom, sans connaître la moindre adresse IP.

Pourquoi ça fonctionne

Un réseau personnalisé, contrairement au réseau par défaut, fait tourner un petit service de résolution de noms interne : chaque conteneur qui le rejoint peut être contacté par les autres membres du même réseau via son nom, comme un carnet d'adresses tenu automatiquement à jour par Docker.

L'isolation du reste du monde reste intacte

Un conteneur placé sur mini-carnet-net ne devient pas accessible depuis l'extérieur pour autant : sans option -p, comme vu au guide 16, aucun port n'est publié vers votre ordinateur. Redis reste ici joignable uniquement par d'autres conteneurs du même réseau, jamais directement depuis votre navigateur.

N'exposez jamais Redis directement sur Internet

Par défaut, Redis n'exige aucun mot de passe. C'est parfaitement adapté à un usage local, comme ici, où seul un autre conteneur du même réseau peut le contacter. Ce serait en revanche une vraie faille de sécurité si son port était publié publiquement avec -p sans protection supplémentaire. Vous retrouverez ce principe au guide 29.

Vérifiez que vous avez compris

Vous lancez un troisième conteneur, sans lui donner l'option --network mini-carnet-net. Va-t-il pouvoir contacter Redis en utilisant simplement le nom redis ?

Non. Sans rejoindre explicitement le même réseau personnalisé, ce nouveau conteneur se retrouve sur le réseau par défaut, où la résolution de noms entre conteneurs ne fonctionne pas. Il faudrait lui ajouter --network mini-carnet-net au moment de son lancement pour qu'il puisse, lui aussi, joindre Redis par son nom.