Comment se connecter à Localhost dans un conteneur Docker

0
18

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 pouvez 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 à partir d'un conteneur Docker.

L'option facile

Docker Desktop 18.03+ pour Windows et Mac prennent en charge 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 et 127.0.0.1 – Ceux-ci se résolvent dans le conteneur.
  • 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 sous Linux peuvent également activer host.docker.internal via l'indicateur –add-host pour l'exécution de docker . 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

L'indicateur –add-host ajoute une entrée au fichier /etc/hosts du conteneur. La valeur indiquée ci-dessus mappe host.docker.internal à la passerelle hôte du conteneur, qui correspond à la valeur réelle de localhost. Vous pouvez remplacer host.docker.internal par votre propre chaîne si vous préférez.

Connexion au réseau hôte

Docker fournit un réseau hôte qui permet aux conteneurs de partager la pile réseau de votre hôte. Cette approche signifie que localhost à l'intérieur d'un conteneur se résout en hôte physique, au lieu du conteneur lui-même.

Publicité

Les conteneurs sont lancés avec le réseau hôte en ajoutant l'indicateur –network=host :

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 champ network_mode :

services : my-service : network_mode : hôte

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 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 le sont pas explicitement. déclaré avec le drapeau -p. Le nom d'hôte par défaut du conteneur correspondra à celui de l'hôte, bien que cela puisse être modifié avec l'indicateur –hostname.

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 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 à travers.

Accéder à l'hôte avec le mode pont par défaut

Votre hôte est toujours accessible à partir de conteneurs dans le mode de mise en réseau pont par défaut. Il vous suffit de le référencer par son IP réseau Docker, au lieu de localhost ou 127.0.0.1.

Publicité

La plupart des installations Docker Engine représenteront l'hôte comme 172.17.0.1 sur le réseau de pont docker0 par défaut. 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 la ligne inet. 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 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 localhost et 127.0.0.1. Sinon, vous verrez une connexion refusée ou des erreurs similaires dans votre conteneur.

Résumé

Vous avez plusieurs options lorsque vous devez atteindre l'extérieur un conteneur Docker sur l'hôte local de votre machine. Si vous utilisez Windows ou Mac, il est préférable d'utiliser l'alias host.docker.internal intégré. Les utilisateurs de Linux peuvent configurer quelque chose de similaire avec l'indicateur –add-host 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 vous devez rester conscient des risques et des limites. Ce n'est pas une option appropriée lorsqu'une isolation réseau forte est requise.

Publicité

Le 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 à partir de 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.