Comment obtenir l'adresse IP de l'hôte Docker à l'intérieur d'un conteneur Docker
358
Comme le dit le titre. Je dois être en mesure de récupérer l'adresse IP des hôtes Docker et les cartes de port de l'hôte vers le conteneur, et de le faire à l'intérieur du conteneur.
Pourriez-vous nous expliquer comment vous souhaitez utiliser ces informations? Vous avez dit "hôtes dockers" - exécutez-vous Docker sur plusieurs hôtes? Une fois que votre conteneur connaît l'adresse IP de l'hôte et des cartes de port, que fera-t-il?
Andy
La façon la plus simple de transmettre les adresses IP de l'hôte docker au conteneur docker, je pense que vous devriez faire un appel à l'intérieur du conteneur en utilisant 'docker container exec'. Supposons que vous souhaitiez envoyer une requête ping à l'hôte depuis l'intérieur du conteneur busybox, utilisez par exemple: $ IP = '8.8.8.8' && docker container busybox ping $ IP 'La façon de trouver l'adresse IP de l'hôte, utilisez ce que vous préférez.
SauloAlessandre
Réponses:
315
/sbin/ip route|awk '/default/ { print $3 }'
Comme @MichaelNeale l'a remarqué, cela n'a aucun sens d'utiliser cette méthode Dockerfile(sauf lorsque nous avons besoin de cette adresse IP uniquement lors de la génération), car cette adresse IP sera codée en dur pendant la génération.
Lorsque vous utilisez le pont Docker (par défaut) pour les conteneurs, cela produira l'IP des ponts comme 172.17.42.1 plutôt que l'IP de l'hôte comme 192.168.1.x (je suppose que votre hôte est sur un NAT domestique). Utiliser la réponse @Magno Torres est probablement ce que les gens veulent dans de telles situations si vous voulez l'adresse 192.168.1.x.
Programster
2
que RUN ne fonctionnera pas comme vous vous y attendez - il calculera seulement l'IP au moment de la construction - et sera toujours statique après cela, et pas utile. Ce sera l'IP de l'hôte de build.
Michael Neale
7
@Programster, je peux supposer que les gens veulent la connexion entre l'hôte docker et le conteneur, c'est ce que le pont IP peut vous donner (bien sûr dans l'installation "domestique" standard). Pourquoi quelqu'un aurait-il besoin d'une "véritable" adresse IP d'hôte si elle peut se trouver même en dehors du pont Docker et être inaccessible? C'est la solution pour toutes les personnes qui viennent d'installer Docker et qui souhaitent jouer avec en peu de temps.
spinus
1
@MichaelNeale, comme avant, je suppose que la plupart des gens qui commencent par docker ont besoin d'une connexion entre leur hôte et leur conteneur, c'est tout. Si quelqu'un fait des déploiements «corrects», il n'utilise probablement pas de toute façon le pont Docker, il utilise un réseau personnalisé et il est probablement au courant de toutes les bizarreries du réseau ou il a configuré DNS (ou toute autre découverte).
spinus
1
@spinus - mais cela ne sera valable que s'il s'exécute sur l'hôte sur lequel il a été construit - dans ce cas - vous pouvez simplement le coder en dur - ou le rechercher - je pense que ce n'est pas une réponse utile et qu'il induira beaucoup en erreur de personnes - vous recommandons de le supprimer. (Le bit RUN)
Michael Neale
183
À partir de la version 18.03, vous pouvez utiliser host.docker.internall'adresse IP de l'hôte.
Fonctionne dans Docker pour Mac , Docker pour Windows et peut-être d'autres plates-formes également.
Il s'agit d'une mise à jour spécifique au Mac docker.for.mac.localhost, disponible depuis la version 17.06 et docker.for.mac.host.internaldisponible depuis la version 17.12, qui peut également fonctionner sur cette plate-forme.
Notez, comme dans la documentation Mac et Windows , ceci est uniquement à des fins de développement.
Par exemple, j'ai des variables d'environnement définies sur mon hôte:
@allanberry, malheureusement, les utilisateurs de Docker préfèrent ne pas nous donner un moyen indépendant de la plate-forme pour ce faire, car ils préfèrent ne pas accepter les cas d'utilisation involontaires (comme accéder à n'importe quel service sur la machine locale à partir d'un conteneur Docker)
Andy
21
J'ai été présenté à Docker comme Build it une fois, exécutez-le partout. Mais cela est faux car vous devez toujours configurer également le système hôte. Cela docker.for.mac..est donc inutile car dans la plupart des cas, vous n'avez pas d'environnement Linux ou Mac uniquement dans votre entreprise. C'est mélangé, vous avez des développeurs utilisant Linux et Mac et Windows. Ce domaine n'a aucun sens, car dans 99% des cas, il s'agit d'un environnement OS hôte mixte. Je ne développe pas de conteneur sous macOS et je ne le déploie pas sur un serveur macOS. Je le déploie sur Linux. C'est ce que tout le monde fait. Alors, à quoi ça sert même docker.for.mac..?
TheFox
1
@allanberry docker.for.mac.host.internaln'a pas d'importance si vous utilisez Docker avec ou sans docker-compose. Je souhaite utiliser un hôte fixe dans les fichiers de configuration. IDK, par exemple, docker.host.internalqui pointe toujours vers l'adresse IP de l'hôte. Quel que soit le système hôte que j'utilise. C'est tout l'intérêt d'utiliser Docker: je veux être autonome. Je comprends que c'est encore plus délicat sur macOS car vous avez une autre couche entre le système hôte et le conteneur. Mais de toute façon, à mon avis docker.for.mac.host.internalest inutile si vous ne pouvez l'utiliser que pour macOS.
cela fonctionne parfaitement, j'ai dockerCe pour windows et jenkins en cours d'exécution dans l'un des conteneurs. Je voulais exécuter la commande docker dans jenkins mais docker n'a pas pu se connecter à l'étape d'ajout d'un cloud, j'ai utilisé ce tcp: //host.docker.internal: 2375 et activé `` exposer le démon sur localhost: 2375 '' et cela fonctionne. sauvé beaucoup de temps. Merci!
Vikash
84
Mise à jour: sur Docker pour Mac , à partir de la version 18.03, vous pouvez utiliser host.docker.internal comme IP de l'hôte. Voir la réponse d'Allanberry . Pour les versions antérieures de Docker pour Mac, la réponse suivante peut toujours être utile:
Sur Docker pour Mac, le docker0pont n'existe pas, donc les autres réponses ici peuvent ne pas fonctionner. Cependant, tout le trafic sortant est acheminé via votre hôte parent.Par conséquent, tant que vous essayez de vous connecter à une adresse IP qu'il reconnaît comme lui-même (et que le conteneur Docker ne pense pas être lui-même), vous devriez pouvoir vous connecter. Par exemple, si vous l'exécutez à partir de l'exécution de la machine parente:
ipconfig getifaddr en0
Cela devrait vous montrer l'IP de votre Mac sur son réseau actuel et votre conteneur Docker devrait également pouvoir se connecter à cette adresse. C'est bien sûr un problème si cette adresse IP change jamais, mais vous pouvez ajouter une IP de bouclage personnalisée à votre Mac que le conteneur ne pense pas être lui-même en faisant quelque chose comme ça sur la machine parente:
sudo ifconfig lo0 alias 192.168.46.49
Vous pouvez ensuite tester la connexion à partir du conteneur Docker avec telnet. Dans mon cas, je voulais me connecter à un serveur xdebug distant:
telnet 192.168.46.49 9000
Maintenant, lorsque le trafic arrive sur votre Mac, adressé au 192.168.46.49 (et que tout le trafic sortant de votre conteneur passe par votre Mac), votre Mac supposera que l'IP est elle-même. Lorsque vous avez fini d'utiliser cette IP, vous pouvez supprimer l'alias de bouclage comme ceci:
sudo ifconfig lo0 -alias 192.168.46.49
Une chose à laquelle faire attention est que le conteneur Docker n'enverra pas de trafic à l'hôte parent s'il pense que la destination du trafic est elle-même. Vérifiez donc l'interface de bouclage à l'intérieur du conteneur si vous avez des problèmes:
sudo ip addr show lo
Dans mon cas, cela a montré inet 127.0.0.1/8que je ne pouvais pas utiliser d'IP dans la 127.*plage. C'est pourquoi j'ai utilisé 192.168.*dans l'exemple ci-dessus. Assurez-vous que l'IP que vous utilisez n'entre pas en conflit avec quelque chose sur votre propre réseau.
Il s'agit d'une méthode très pratique pour ceux qui utilisent AWS. Je l'utilise pour configurer le client des agents Consul et les adresses de liaison. Il est idéal lorsque vous ne pouvez pas utiliser la mise en réseau hôte (comme le déploiement de conteneurs dans Elastic Beanstalk et ECS).
Richard Clayton
C'est une bouée de sauvetage, merci. J'avais du mal à comprendre comment gérer la communication entre les conteneurs de mon cluster ECS.
Brennan
Sur Phusion basimage (basé sur ubuntu), j'ai dû changer un peu votre commande:ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi
25
La seule façon consiste à transmettre les informations d'hôte en tant qu'environnement lorsque vous créez un conteneur
Plus spécifiquement, l'adresse IP du pont peut être transmise en utilisant une option de ligne de commande comme: -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(en utilisant la réponse acceptée de unix.stackexchange.com/questions/87468/… )
ncoghlan
7
Je pense que cela ne fonctionne pas dans Docker pour Mac / Windows. (l'IP du pont)
zx1986
22
Le --add-hostpourrait être une solution plus propre (mais sans la partie du port, seul l'hôte peut être manipulé avec cette solution). Donc, dans votre docker runcommande, faites quelque chose comme:
J'ai dit "fait pour ça" quand quelqu'un d'autre voulait une entrée dans / etc / hosts; dans cette question, ce n'est pas vraiment vrai. OP a également demandé «hôte et cartes de port» et vous n'avez couvert que l'hôte.
Bryan
D'accord. J'étais un peu confus car la solution acceptée ne couvre que la partie hôte également. Et je pense que votre solution est supérieure à celle des spinus.
Augunrik
cela ne fonctionne pas si vous souhaitez utiliser dind - docker-in-docker. Inner docker aura une adresse IP différente
bruyant
12
La meilleure pratique standard pour la plupart des applications qui cherchent à le faire automatiquement est: vous ne le faites pas . Au lieu de cela, la personne exécutant le conteneur doit injecter un nom d'hôte / adresse IP externe comme configuration, par exemple en tant que variable d'environnement ou fichier de configuration. Permettre à l'utilisateur d'injecter cela vous donne la conception la plus portable.
Pourquoi serait-ce si difficile? Parce que les conteneurs, de par leur conception, isolent l'application de l'environnement hôte. Par défaut, le réseau est uniquement dédié à ce conteneur et les détails de l'hôte sont protégés contre le processus s'exécutant à l'intérieur du conteneur qui peut ne pas être entièrement fiable.
Il existe différentes options en fonction de votre situation spécifique:
Si votre conteneur s'exécute avec la mise en réseau d'hôte, vous pouvez consulter la table de routage sur l'hôte directement pour voir l'itinéraire par défaut. À partir de cette question, les travaux suivants me conviennent, par exemple:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Un exemple montrant cela avec la mise en réseau d'hôte dans un conteneur ressemble à ceci:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
Pour certaines versions de Docker Desktop, ils ont injecté une entrée DNS dans la machine virtuelle intégrée:
Si vous voulez votre adresse externe / Internet, vous pouvez interroger un service distant comme:
curl ifconfig.co
Chacun d'eux a des limites et ne fonctionne que dans des scénarios spécifiques. L'option la plus portable consiste toujours à exécuter votre conteneur avec l'adresse IP injectée en tant que configuration, par exemple, voici une option exécutant la ipcommande précédente sur l'hôte et l'injectant en tant que variable d'environnement:
export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP
L'hôte a une adresse IP changeante (ou aucune si vous n'avez pas d'accès au réseau). À partir du 18.03, notre recommandation est de se connecter au nom DNS spécial host.docker.internal, qui se résout en l'adresse IP interne utilisée par l'hôte. Ceci est à des fins de développement et ne fonctionnera pas dans un environnement de production en dehors de Docker pour Windows.
J'ai essayé votre solution et il semble que la commande nslookup ne soit pas trouvée
Sergey
@Sergey Votre image est-elle basée sur Alpine Linux? Sinon, vérifiez l'équivalent pour votre spécifique linux distribution.
Kamil Witkowski
Non, j'utilise exactement votre commande - docker run -it nginx / bin / ash
Sergey
Ok - si vous êtes sur Windows, je suis passé à linux containerset je n'utilise pas. windows containersVous pouvez le faire en cliquant avec le bouton droit sur docker iconet en sélectionnant Switch to Linux containers. Je pense que cela pourrait être important lorsque vous téléchargez une image. Si vous aviez à windows containervérifier si la suppression de l'anciennginx image et son téléchargement à nouveau vous obtiendrez un autre conteneur. Si cela ne fonctionne toujours pas pour vous - alors vous pouvez essayer de l'installer nslookupdans le ash.
Kamil Witkowski
Si vous ne pouvez pas faire nslookup, faites simplement un ping. Il montrera l'adresse IP résolue. Pour moi, cette réponse fonctionne, et j'utilise simplement ce nom d'hôte ( host.docker.internal) depuis l'intérieur du conteneur
Dmitry Minkovsky
7
TLDR pour Mac et Windows
docker run -it --rm alpine nslookup host.docker.internal
... imprime l'adresse IP de l'hôte ...
nslookup: can't resolve '(null)': Name does not resolve
Name: host.docker.internal
Address 1: 192.168.65.2
Détails
Sur Mac et Windows , vous pouvez utiliser le nom DNS spécial host.docker.internal.
L'hôte a une adresse IP changeante (ou aucune si vous n'avez pas d'accès au réseau). À partir du 18.03, notre recommandation est de se connecter au nom DNS spécial host.docker.internal, qui se résout en l'adresse IP interne utilisée par l'hôte. C'est à des fins de développement et ne fonctionnera pas dans un environnement de production en dehors de Docker Desktop pour Mac.
Veuillez ne pas ajouter la même réponse à plusieurs questions . Répondez à la meilleure et marquez les autres comme des doublons, une fois que vous gagnez suffisamment de réputation. S'il ne s'agit pas d'un doublon, adaptez le message à la question et indiquez-le pour suppression.
Bhargav Rao
6
Docker pour Mac
Je souhaite me connecter d'un conteneur à un service sur l'hôte
L'hôte a une adresse IP changeante (ou aucune si vous n'avez pas d'accès au réseau). À partir du 18.03, notre recommandation est de se connecter au nom DNS spécial host.docker.internal, qui se résout en l'adresse IP interne utilisée par l'hôte.
Si vous avez activé l' API distante Docker (via-Htcp://0.0.0.0:4243 par exemple) et connaissez le nom d'hôte ou l'adresse IP de la machine hôte, cela peut être fait avec beaucoup de bash.
La deuxième ligne récupère l'ID de conteneur de votre section locale /proc/self/cgroup fichier .
La troisième ligne se déroule vers la machine hôte (en supposant que vous utilisez 4243 comme port de docker) puis utilise le nœud pour analyser le JSON renvoyé pour le DESIRED_PORT.
Cela ne s'applique que lorsque vous utilisez la redirection de port. En effet, HostPortdes informations peuvent être utiles ici, malheureusement, elles HostIppourraient l'être0.0.0.0
Arnout Engelen
4
J'ai Ubuntu 16.03. Pour moi
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [image]
ne fonctionne PAS (la mauvaise IP était en train de générer)
Ma solution de travail était que:
docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]
Voici une autre option pour ceux qui exécutent Docker dans AWS. Cette option évite d'avoir à utiliser apk pour ajouter le paquet curl et économise le précieux 7 Mo d'espace. Utilisez le wget intégré (qui fait partie du binaire monolithique BusyBox):
AFAIK, dans le cas de Docker pour Linux (distribution standard), l'adresse IP de l'hôte sera toujours172.17.0.1 .
Le moyen le plus simple de l'obtenir est via ifconfig(interface docker0) depuis l'hôte:
ifconfig
Depuis l'intérieur d'un docker, la commande suivante d'un docker: ip -4 route show default | cut -d" " -f3
Vous pouvez l'exécuter rapidement dans un docker avec la ligne de commande suivante:
# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"
Le premier bloc de code saisira l'IP du conteneur et non l'IP de l'hôte
Ari
mandoc of hostname -Iavertit de ne pas "faire d'hypothèses sur l'ordre de sortie".
Can't_mutably_borrow
1
Il s'agit d'une implémentation minimaliste dans Node.js pour qui exécute l'hôte sur des instances AWS EC2 , en utilisant l' instance de métadonnées EC2 susmentionnée
const cp = require('child_process');
const ec2 = function (callback) {
const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
// we make it silent and timeout to 1 sec
const args = [URL, '-s', '--max-time', '1'];
const opts = {};
cp.execFile('curl', args, opts, (error, stdout) => {
if (error) return callback(new Error('ec2 ip error'));
else return callback(null, stdout);
})
.on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2
Si vous exécutez un conteneur Windows sur un cluster Service Fabric, l'adresse IP de l'hôte est disponible via la variable d'environnement Fabric_NodeIPOrFQDN. Variables d'environnement Service Fabric
Voici comment je le fais. Dans ce cas, il ajoute une entrée d'hôtes dans / etc / hosts dans l'image docker pointant l'hôte taurus vers mon IP de machine locale::
Ensuite, à partir du conteneur Docker, le script peut utiliser le nom d'hôte taurus-host pour accéder à ma machine locale qui héberge le conteneur Docker.
Vous pouvez simplement utiliser le nom de conteneur DNS pour accéder au système hôte, par exemple curl http: // dockerhost: 9200 , donc pas besoin de vous tracasser avec une adresse IP.
Réponses:
Comme @MichaelNeale l'a remarqué, cela n'a aucun sens d'utiliser cette méthode
Dockerfile
(sauf lorsque nous avons besoin de cette adresse IP uniquement lors de la génération), car cette adresse IP sera codée en dur pendant la génération.la source
À partir de la version 18.03, vous pouvez utiliser
host.docker.internal
l'adresse IP de l'hôte.Fonctionne dans Docker pour Mac , Docker pour Windows et peut-être d'autres plates-formes également.
Il s'agit d'une mise à jour spécifique au Mac
docker.for.mac.localhost
, disponible depuis la version 17.06 etdocker.for.mac.host.internal
disponible depuis la version 17.12, qui peut également fonctionner sur cette plate-forme.Notez, comme dans la documentation Mac et Windows , ceci est uniquement à des fins de développement.
Par exemple, j'ai des variables d'environnement définies sur mon hôte:
Dans mon
docker-compose.yml
dossier, j'ai ceci:la source
docker.for.mac..
est donc inutile car dans la plupart des cas, vous n'avez pas d'environnement Linux ou Mac uniquement dans votre entreprise. C'est mélangé, vous avez des développeurs utilisant Linux et Mac et Windows. Ce domaine n'a aucun sens, car dans 99% des cas, il s'agit d'un environnement OS hôte mixte. Je ne développe pas de conteneur sous macOS et je ne le déploie pas sur un serveur macOS. Je le déploie sur Linux. C'est ce que tout le monde fait. Alors, à quoi ça sert mêmedocker.for.mac..
?docker.for.mac.host.internal
n'a pas d'importance si vous utilisez Docker avec ou sansdocker-compose
. Je souhaite utiliser un hôte fixe dans les fichiers de configuration. IDK, par exemple,docker.host.internal
qui pointe toujours vers l'adresse IP de l'hôte. Quel que soit le système hôte que j'utilise. C'est tout l'intérêt d'utiliser Docker: je veux être autonome. Je comprends que c'est encore plus délicat sur macOS car vous avez une autre couche entre le système hôte et le conteneur. Mais de toute façon, à mon avisdocker.for.mac.host.internal
est inutile si vous ne pouvez l'utiliser que pour macOS.host.docker.internal
fonctionne également sur Docker pour Windows , au moins au moment de la rédaction de ce commentaire.Mise à jour: sur Docker pour Mac , à partir de la version 18.03, vous pouvez utiliser host.docker.internal comme IP de l'hôte. Voir la réponse d'Allanberry . Pour les versions antérieures de Docker pour Mac, la réponse suivante peut toujours être utile:
Sur Docker pour Mac, le
docker0
pont n'existe pas, donc les autres réponses ici peuvent ne pas fonctionner. Cependant, tout le trafic sortant est acheminé via votre hôte parent.Par conséquent, tant que vous essayez de vous connecter à une adresse IP qu'il reconnaît comme lui-même (et que le conteneur Docker ne pense pas être lui-même), vous devriez pouvoir vous connecter. Par exemple, si vous l'exécutez à partir de l'exécution de la machine parente:Cela devrait vous montrer l'IP de votre Mac sur son réseau actuel et votre conteneur Docker devrait également pouvoir se connecter à cette adresse. C'est bien sûr un problème si cette adresse IP change jamais, mais vous pouvez ajouter une IP de bouclage personnalisée à votre Mac que le conteneur ne pense pas être lui-même en faisant quelque chose comme ça sur la machine parente:
Vous pouvez ensuite tester la connexion à partir du conteneur Docker avec telnet. Dans mon cas, je voulais me connecter à un serveur xdebug distant:
Maintenant, lorsque le trafic arrive sur votre Mac, adressé au 192.168.46.49 (et que tout le trafic sortant de votre conteneur passe par votre Mac), votre Mac supposera que l'IP est elle-même. Lorsque vous avez fini d'utiliser cette IP, vous pouvez supprimer l'alias de bouclage comme ceci:
Une chose à laquelle faire attention est que le conteneur Docker n'enverra pas de trafic à l'hôte parent s'il pense que la destination du trafic est elle-même. Vérifiez donc l'interface de bouclage à l'intérieur du conteneur si vous avez des problèmes:
Dans mon cas, cela a montré
inet 127.0.0.1/8
que je ne pouvais pas utiliser d'IP dans la127.*
plage. C'est pourquoi j'ai utilisé192.168.*
dans l'exemple ci-dessus. Assurez-vous que l'IP que vous utilisez n'entre pas en conflit avec quelque chose sur votre propre réseau.la source
Pour ceux qui exécutent Docker dans AWS, les métadonnées d'instance pour l'hôte sont toujours disponibles à l'intérieur du conteneur.
Par exemple:
la source
ifconfig eth0 | grep -oP 'inet \K\S+'
La seule façon consiste à transmettre les informations d'hôte en tant qu'environnement lorsque vous créez un conteneur
la source
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(en utilisant la réponse acceptée de unix.stackexchange.com/questions/87468/… )Le
--add-host
pourrait être une solution plus propre (mais sans la partie du port, seul l'hôte peut être manipulé avec cette solution). Donc, dans votredocker run
commande, faites quelque chose comme:(Depuis https://stackoverflow.com/a/26864854/127400 )
la source
La meilleure pratique standard pour la plupart des applications qui cherchent à le faire automatiquement est: vous ne le faites pas . Au lieu de cela, la personne exécutant le conteneur doit injecter un nom d'hôte / adresse IP externe comme configuration, par exemple en tant que variable d'environnement ou fichier de configuration. Permettre à l'utilisateur d'injecter cela vous donne la conception la plus portable.
Pourquoi serait-ce si difficile? Parce que les conteneurs, de par leur conception, isolent l'application de l'environnement hôte. Par défaut, le réseau est uniquement dédié à ce conteneur et les détails de l'hôte sont protégés contre le processus s'exécutant à l'intérieur du conteneur qui peut ne pas être entièrement fiable.
Il existe différentes options en fonction de votre situation spécifique:
Si votre conteneur s'exécute avec la mise en réseau d'hôte, vous pouvez consulter la table de routage sur l'hôte directement pour voir l'itinéraire par défaut. À partir de cette question, les travaux suivants me conviennent, par exemple:
Un exemple montrant cela avec la mise en réseau d'hôte dans un conteneur ressemble à ceci:
Pour certaines versions de Docker Desktop, ils ont injecté une entrée DNS dans la machine virtuelle intégrée:
Si vous exécutez dans un environnement cloud, vous pouvez vérifier le service de métadonnées auprès du fournisseur de cloud, par exemple celui d'AWS:
Si vous voulez votre adresse externe / Internet, vous pouvez interroger un service distant comme:
Chacun d'eux a des limites et ne fonctionne que dans des scénarios spécifiques. L'option la plus portable consiste toujours à exécuter votre conteneur avec l'adresse IP injectée en tant que configuration, par exemple, voici une option exécutant la
ip
commande précédente sur l'hôte et l'injectant en tant que variable d'environnement:la source
curl ifconfig.co
Commande vraiment utile .. Merci :)Si vous voulez une
IP
adresse réelle (pas un pontIP
)Windows
et que vous avez un docker18.03
(ou plus récent), procédez comme suit:Exécutez bash sur le conteneur depuis l'hôte où se trouve le nom de l'image
nginx
(fonctionneAlpine Linux distribution
):Puis courez à l'intérieur du conteneur
192.168.65.2
est l'IP de l'hôte - pas l'IP du pont comme dans laspinus
réponse acceptée.J'utilise ici host.docker.internal :
la source
Alpine Linux
? Sinon, vérifiez l'équivalent pour votre spécifiquelinux distribution
.linux containers
et je n'utilise pas.windows containers
Vous pouvez le faire en cliquant avec le bouton droit surdocker icon
et en sélectionnantSwitch to Linux containers
. Je pense que cela pourrait être important lorsque vous téléchargez une image. Si vous aviez àwindows container
vérifier si la suppression de l'anciennginx
image et son téléchargement à nouveau vous obtiendrez un autre conteneur. Si cela ne fonctionne toujours pas pour vous - alors vous pouvez essayer de l'installernslookup
dans leash
.host.docker.internal
) depuis l'intérieur du conteneurTLDR pour Mac et Windows
... imprime l'adresse IP de l'hôte ...
Détails
Sur Mac et Windows , vous pouvez utiliser le nom DNS spécial
host.docker.internal
.la source
Docker pour Mac Je souhaite me connecter d'un conteneur à un service sur l'hôte
L'hôte a une adresse IP changeante (ou aucune si vous n'avez pas d'accès au réseau). À partir du 18.03, notre recommandation est de se connecter au nom DNS spécial host.docker.internal, qui se résout en l'adresse IP interne utilisée par l'hôte.
La passerelle est également accessible en tant que gateway.docker.internal. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
la source
Si vous avez activé l' API distante Docker (via
-H
tcp://0.0.0.0:4243
par exemple) et connaissez le nom d'hôte ou l'adresse IP de la machine hôte, cela peut être fait avec beaucoup de bash.Au sein de l'utilisateur de mon conteneur
bashrc
:La deuxième ligne récupère l'ID de conteneur de votre section locale
/proc/self/cgroup
fichier .La troisième ligne se déroule vers la machine hôte (en supposant que vous utilisez 4243 comme port de docker) puis utilise le nœud pour analyser le JSON renvoyé pour le
DESIRED_PORT
.la source
HostPort
des informations peuvent être utiles ici, malheureusement, ellesHostIp
pourraient l'être0.0.0.0
J'ai Ubuntu 16.03. Pour moi
ne fonctionne PAS (la mauvaise IP était en train de générer)
Ma solution de travail était que:
la source
Voici une autre option pour ceux qui exécutent Docker dans AWS. Cette option évite d'avoir à utiliser apk pour ajouter le paquet curl et économise le précieux 7 Mo d'espace. Utilisez le wget intégré (qui fait partie du binaire monolithique BusyBox):
la source
AFAIK, dans le cas de Docker pour Linux (distribution standard), l'adresse IP de l'hôte sera toujours
172.17.0.1
.Le moyen le plus simple de l'obtenir est via
ifconfig
(interface docker0) depuis l'hôte:Depuis l'intérieur d'un docker, la commande suivante d'un docker:
ip -4 route show default | cut -d" " -f3
Vous pouvez l'exécuter rapidement dans un docker avec la ligne de commande suivante:
J'espère que ça aide.
la source
Sous Linux, vous pouvez exécuter
Sous macOS, votre ordinateur hôte n'est pas l'hôte Docker. Docker installera son OS hôte dans VirtualBox.
la source
hostname -I
avertit de ne pas "faire d'hypothèses sur l'ordre de sortie".Il s'agit d'une implémentation minimaliste dans Node.js pour qui exécute l'hôte sur des instances AWS EC2 , en utilisant l' instance de métadonnées EC2 susmentionnée
et utilisé comme
la source
Si vous exécutez un conteneur Windows sur un cluster Service Fabric, l'adresse IP de l'hôte est disponible via la variable d'environnement
Fabric_NodeIPOrFQDN
. Variables d'environnement Service Fabricla source
Voici comment je le fais. Dans ce cas, il ajoute une entrée d'hôtes dans / etc / hosts dans l'image docker pointant l'hôte taurus vers mon IP de machine locale::
Ensuite, à partir du conteneur Docker, le script peut utiliser le nom d'hôte taurus-host pour accéder à ma machine locale qui héberge le conteneur Docker.
la source
Peut-être que le conteneur que j'ai créé est également utile https://github.com/qoomon/docker-host
Vous pouvez simplement utiliser le nom de conteneur DNS pour accéder au système hôte, par exemple curl http: // dockerhost: 9200 , donc pas besoin de vous tracasser avec une adresse IP.
la source
La solution que j'utilise est basée sur un "serveur" qui retourne l'adresse externe de l'hôte Docker lorsqu'il reçoit une requête http.
Sur le "serveur":
1) Démarrez jwilder / nginx-proxy
2) Démarrer le conteneur ipify
Désormais, lorsqu'un conteneur envoie une requête http au serveur, par exemple
l'adresse IP de l'hôte Docker est retournée par ipify via l'en-tête http "X-Forwarded-For"
Exemple (le serveur ipify a le nom "ipify.example.com" et s'exécute sur le port 80, l'hôte docker a l'IP 10.20.30.40):
À l'intérieur du conteneur, vous pouvez maintenant appeler:
la source
Essaye ça
la source
Sur Ubuntu, la
hostname
commande peut être utilisée avec les options suivantes:-i
,--ip-address
adresses pour le nom d'hôte-I
,--all-ip-addresses
toutes les adresses de l'hôtePar exemple:
Pour affecter à la variable, la ligne unique suivante peut être utilisée:
la source
Avec https://docs.docker.com/machine/install-machine/
a) $ docker-machine ip
b) Obtenez l'adresse IP d'une ou plusieurs machines.
la source