Lorsque vous travaillez avec Docker, vous conteneurisez généralement les services qui forment votre pile et utilisez la mise en réseau inter-conteneurs pour communiquer entre eux. Parfois, vous pourriez avoir besoin d'un conteneur pour parler à un service sur votre hôte qui n'a pas été conteneurisé. Voici comment accéder à localhost
ou 127.0.0.1
depuis un conteneur Docker.
L'option facile
Docker Desktop 18.03+ pour Windows et Mac prend en charge host.docker.internal
comme alias fonctionnel pour localhost
. Utilisez cette chaîne dans vos conteneurs pour accéder à votre machine hôte.
localhost
et127.0.0.1
– Ceux-ci se résolvent dans le conteneur .host.docker.internal
– Cela résout l'hôte externe.
Si vous exécutez un serveur MySQL sur votre hôte, les conteneurs Docker peuvent y accéder en se connectant à host.docker.internal:3306
. C'est la technique la plus simple lorsque vous travaillez sur une machine Windows ou Mac.
Les utilisateurs de Docker Engine sous Linux peuvent activer host.docker.internal
aussi via le --add-host
drapeau pour docker run
. Démarrez vos conteneurs avec cet indicateur pour exposer la chaîne d'hôte :
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
Le --add-host
flag ajoute une entrée au conteneur /etc/hosts
dossier. La valeur indiquée ci-dessus correspond à host.docker.internal
à la passerelle hôte du conteneur, qui correspond au vrai localhost
valeur. Vous pouvez remplacer host.docker.internal
avec votre propre chaîne si vous préférez.
Connexion au réseau hôte
Docker fournit un host
réseau qui permet aux conteneurs de partager la pile réseau de votre hôte. Cette approche signifie localhost
à l'intérieur d'un conteneur se résout à l'hôte physique, au lieu du conteneur lui-même.
Les conteneurs sont lancés avec le réseau hôte en ajoutant le --network=host
drapeau :
docker run -d --network=host my-container:latest
Maintenant, votre conteneur peut référencer localhost
ou 127.0.0.1
directement.
Si vous utilisez Docker Compose, modifiez la définition de service de votre conteneur pour inclure le network_mode
champ :
services: my-service: network_mode: host
Il y a quelques mises en garde à cette approche. Il est important de considérer toutes les implications avant de l'utiliser. Les conteneurs ont généralement leur propre réseau privé, séparé de la pile de l'hôte. Lorsque vous spécifiez --network=host
, le conteneur hérite par défaut des paramètres de réseau partagé de votre hôte.
Tous les ports exposés par le conteneur seront exposés sur l'hôte , même s'ils ne sont pas explicitement déclarés avec le -p
drapeau. Le nom d'hôte par défaut du conteneur correspondra à celui de l'hôte, bien que cela puisse être modifié avec le --hostname
drapeau.
Le réseau hôte peut être un problème de sécurité qui rompt le modèle d'isolation des conteneurs Docker. Cela peut toujours être utile dans les scénarios où vous êtes sûr que l'exécution de conteneurs n'entrera pas en conflit les uns avec les autres ou ne causera pas de problèmes dans votre environnement hôte. Le mode réseau hôte est également plus rapide que le mode pont par défaut car il n'y a pas de couche de virtualisation pour le trafic.
Accéder à l'hôte avec le mode pont par défaut
Votre hôte est toujours accessible à partir des conteneurs dans le bridge
par défaut mode réseau. Il vous suffit de le référencer par son IP réseau Docker, au lieu de localhost
ou 127.0.0.1
.
La plupart des installations de Docker Engine représenteront l'hôte sous la forme 172.17.0.1
sur le docker0
par défaut réseau de ponts. Vous pouvez vérifier votre propre IP en exécutant cette commande sur votre hôte :
ip addr show docker0
L'adresse IP Docker de votre hôte sera affichée sur inet
doubler. Connectez-vous à cette adresse IP depuis vos conteneurs pour accéder avec succès aux services exécutés sur votre hôte.
Un écueil de cette approche est que vous ne pourrez peut-être pas vous connecter aux services qui se lient directement à localhost
. Vous devrez vous assurer que vos services écoutent les connexions sur votre IP de pont Docker, ainsi que sur localhost
et 127.0.0.1
. Sinon, vous verrez connection refused
ou des erreurs similaires dans votre conteneur.
Résumé
Vous disposez de plusieurs options lorsque vous devez accéder à l'extérieur d'un conteneur Docker au localhost
de votre machine. . Si vous êtes sur Windows ou Mac, il est préférable d'utiliser le host.docker.internal
intégré alias. Les utilisateurs de Linux peuvent configurer quelque chose de similaire avec le --add-host
indicateur lors du démarrage d'un conteneur.
Le mode réseau hôte est une alternative universelle qui permet aux conteneurs de partager la pile réseau de votre hôte. Vous pouvez référencer localhost
directement, mais doivent rester conscients des risques et des limites. Ce n'est pas une option appropriée lorsqu'une forte isolation réseau est requise.
Le maintien du mode pont peut être la meilleure option pour les charges de travail qui le prennent en charge. Liez les services de votre hôte à son IP Docker, puis utilisez cette adresse pour vous connecter depuis votre conteneur. Cela vous permet d'utiliser la mise en réseau virtualisée par conteneur de Docker tout en fournissant une route vers votre hôte lorsque cela est nécessaire.