Comment se connecter à Localhost dans un conteneur Docker
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 communiquer avec 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.
Sommaire
L’option facile
Prise en charge de Docker Desktop 18.03+ pour Windows et Mac host.docker.internal
comme alias fonctionnel pour localhost
. Utilisez cette chaîne à l’intérieur de vos conteneurs pour accéder à votre machine hôte.
localhost
et127.0.0.1
– Ceux-ci se résolvent au récipient.host.docker.internal
– Cela se résout à l’hôte extérieur.
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 sur 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 hôte :
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
Les --add-host
flag ajoute une entrée au conteneur /etc/hosts
déposer. La valeur indiquée ci-dessus cartes host.docker.internal
à la passerelle hôte du conteneur, qui correspond à la vraie localhost
valeur. Tu pourrais 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 sur 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
Votre conteneur peut désormais 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 disposent généralement de leur propre réseau privé, distinct de la pile de l’hôte. Lorsque vous spécifiez --network=host
, le conteneur hérite par défaut des paramètres de mise en réseau partagés 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 qu’il puisse être modifié avec le --hostname
drapeau.
Le réseau hôte peut être un problème de sécurité qui brise le modèle d’isolement des conteneurs Docker. Cela peut toujours être utile dans les scénarios où vous êtes sûr que les conteneurs en cours d’exécution n’entreront pas en conflit les uns avec les autres ou ne causeront pas de problèmes dans votre environnement hôte. Le mode de mise en réseau de l’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ès à l’hôte avec le mode pont par défaut
Votre hôte est toujours accessible à partir de conteneurs par défaut bridge
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 Docker Engine représenteront l’hôte comme 172.17.0.1
par défaut docker0
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’IP Docker de votre hôte sera affiché sur le inet
ligne. Connectez-vous à cette adresse IP depuis vos conteneurs pour accéder avec succès aux services exécutés sur votre hôte.
L’un des pièges de cette approche est que vous ne pourrez peut-être pas vous connecter à des services qui se lient directement à localhost
. Vous devrez vous assurer que vos services écoutent les connexions sur votre IP de pont Docker, ainsi que localhost
et 127.0.0.1
. sinon tu verras connection refused
ou des erreurs similaires dans votre conteneur.
Sommaire
Vous avez plusieurs options lorsque vous devez atteindre l’extérieur d’un conteneur Docker vers votre machine localhost
. Si vous êtes sous Windows ou Mac, il est préférable d’utiliser le host.docker.internal
alias. Les utilisateurs de Linux peuvent configurer quelque chose de similaire avec le --add-host
flag 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 isolation réseau forte est requise.
S’en tenir au 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 un itinéraire vers votre hôte lorsque cela est nécessaire.