web-dev-qa-db-fra.com

À partir d'un conteneur Docker, comment puis-je me connecter à l'hôte local de la machine?

J'ai donc un Nginx sous un docker, un mysql sous localhost, je veux me connecter au MySql à partir de mon Nginx. Le MySql est exécuté sur localhost et n'expose pas un port au monde extérieur. Il est donc lié à localhost et non à l'adresse IP de la machine.

Existe-t-il un moyen de se connecter à ce MySql ou à un autre programme sur localhost à partir de ce conteneur de menu fixe?

826
Phil

Edit: Si vous utilisez Docker-for-mac ou Docker-for-Windows 18.03+, connectez-vous simplement à votre service mysql en utilisant l'hôte Host.docker.internal

A partir de Docker 18.04, cela ne fonctionne pas sur Docker pour Linux. Cependant, en utilisant un conteneur comme décrit dans la réponse de qoomon vous pouvez le faire fonctionner.


TLDR

Utilisez --network="Host" dans votre commande docker run, puis 127.0.0.1 dans votre conteneur docker désignera votre hôte docker.

Remarque: Ce mode ne fonctionne que sur Docker pour Linux, selon la documentation .


Remarque sur les modes de mise en réseau du conteneur docker

Docker propose différents modes de mise en réseau lors de l'exécution de conteneurs. Selon le mode choisi, vous vous connecterez différemment à votre base de données MySQL qui s'exécute sur l'hôte de menu fixe.

docker run --network = "bridge" (par défaut)

Docker crée un pont nommé docker0 par défaut. Les hôtes du menu fixe et les conteneurs du menu fixe ont une adresse IP sur ce pont.

sur l'hôte Docker, tapez Sudo ip addr show docker0, votre sortie ressemblera à ceci:

[vagrant@docker:~] $ Sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

Donc, ici mon hôte de menu fixe a l'adresse IP 172.17.42.1 sur l'interface réseau docker0.

Maintenant, démarrez un nouveau conteneur et obtenez un shell dessus: docker run --rm -it ubuntu:trusty bash et dans le type de conteneur ip addr show eth0, pour découvrir comment son interface réseau principale est configurée:

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

Ici, mon conteneur a l'adresse IP 172.17.1.192. Regardez maintenant la table de routage:

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

Ainsi, l'adresse IP de l'hôte docker 172.17.42.1 est définie comme route par défaut et est accessible à partir de votre conteneur.

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

docker run --network = "Host"

Vous pouvez également exécuter un conteneur de menu fixe avec les paramètres réseau définis sur Host . Un tel conteneur partagera la pile réseau avec l'hôte docker et, du point de vue du conteneur, localhost (ou 127.0.0.1) fera référence à l'hôte docker.

Sachez que tout port ouvert dans votre conteneur Docker sera ouvert sur l'hôte Docker. Et ceci sans nécessiter l'option -p OU -Pdocker run .

Configuration IP sur mon hôte de docker:

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

et depuis un conteneur de menu fixe en mode Host:

[vagrant@docker:~] $ docker run --rm -it --network=Host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

Comme vous pouvez le voir, l’hôte et le conteneur docker partagent exactement la même interface réseau et ont donc la même adresse IP.


Connexion à MySQL à partir de conteneurs

mode pont

Pour accéder à MySQL exécuté sur le docker Host à partir de conteneurs en mode pont, vous devez vous assurer que le service MySQL est à l'écoute des connexions sur l'adresse IP 172.17.42.1.

Pour ce faire, assurez-vous que vous avez bind-address = 172.17.42.1 ou bind-address = 0.0.0.0 dans votre fichier de configuration MySQL (my.cnf). 

Si vous devez définir une variable d'environnement avec l'adresse IP de la passerelle, vous pouvez exécuter le code suivant dans un conteneur:

export DOCKER_Host_IP=$(route -n | awk '/UG[ \t]/{print $2}')

ensuite, dans votre application, utilisez la variable d'environnement DOCKER_Host_IP pour ouvrir la connexion à MySQL.

Remarque: si vous utilisez bind-address = 0.0.0.0, votre serveur MySQL écoutera les connexions sur toutes les interfaces réseau. Cela signifie que votre serveur MySQL peut être atteint depuis Internet. assurez-vous de configurer les règles de pare-feu en conséquence.

Remarque 2: si vous utilisez bind-address = 172.17.42.1, votre serveur MySQL n'écoutera pas les connexions établies avec 127.0.0.1. Les processus en cours d'exécution sur l'hôte de docker souhaitant se connecter à MySQL doivent utiliser l'adresse IP 172.17.42.1.

Mode hôte

Pour accéder à MySQL exécuté sur l'hôte docker à partir de conteneurs en mode hôte, vous pouvez conserver bind-address = 127.0.0.1 dans votre configuration MySQL. Tout ce que vous avez à faire est de vous connecter à 127.0.0.1 à partir de vos conteneurs:

[vagrant@docker:~] $ docker run --rm -it --network=Host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

note: Utilisez mysql -h 127.0.0.1 et non mysql -h localhost; sinon, le client MySQL essaierait de se connecter en utilisant un socket Unix.

1233
Thomasleveil

Pour macOS et Windows

Docker v 18.03 et plus (depuis le 21 mars 2018)

Utilisez votre adresse IP interne ou connectez-vous au nom DNS spécial Host.docker.internal qui résoudra en adresse IP interne utilisée par l'hôte.

Prise en charge de Linux en attente https://github.com/docker/for-linux/issues/264

MacOS avec les versions antérieures de Docker

Docker pour Mac v 17.12 à 18.02

Comme ci-dessus mais utilisez plutôt docker.for.mac.Host.internal.

Docker pour Mac v 17.06 à 17.11

Comme ci-dessus mais utilisez plutôt docker.for.mac.localhost.

Docker pour Mac 17.05 et inférieur

Pour accéder à la machine hôte à partir du conteneur de menu fixe, vous devez associer un alias IP à votre interface réseau. Vous pouvez associer l'adresse IP de votre choix, assurez-vous simplement que vous ne l'utilisez pas pour autre chose.

Sudo ifconfig lo0 alias 123.123.123.123/24 

Assurez-vous ensuite que votre serveur écoute l’adresse IP mentionnée ci-dessus ou 0.0.0.0. S'il écoute sur localhost 127.0.0.1, il n'acceptera pas la connexion.

Ensuite, pointez simplement votre conteneur docker vers cette adresse IP et vous pourrez accéder à la machine hôte!

Pour tester, vous pouvez exécuter quelque chose comme curl -X GET 123.123.123.123:3000 à l'intérieur du conteneur.

L'alias sera réinitialisé à chaque redémarrage, alors créez un script de démarrage si nécessaire.

Solution et plus de documentation ici: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

247
Janne Annala

Je fais un piratage semblable aux messages ci-dessus pour obtenir l'adresse IP locale mappée sur un nom d'alias (DNS) dans le conteneur. Le problème majeur est d'obtenir dynamiquement avec un script simple qui fonctionne à la fois sous Linux et OSX l'adresse IP de l'hôte. J'ai fait ce script qui fonctionne dans les deux environnements (même dans la distribution Linux avec "$LANG" != "en_*" configuré):

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

Donc, en utilisant Docker Compose, la configuration complète sera:

Script de démarrage (docker-run.sh):

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up

docker-compose.yml:

myapp:
  build: .
  ports:
    - "80:80"
  extra_hosts:
    - "dockerhost:$DOCKERHOST"

Puis changez http://localhost en http://dockerhost dans votre code.

Pour un guide plus détaillé sur la personnalisation du script DOCKERHOST, consultez cet article avec une explication de son fonctionnement.

57
Mariano Ruiz

Solution pour Linux (noyau> = 3.6). 

Ok, votre serveur localhost a l'interface de menu fixe par défaut docker0 avec l'adresse IP 172.17.0.1. Votre conteneur a démarré avec les paramètres réseau par défaut --net = "bridge"

  1. Activez route_localnet pour l'interface docker0:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. Ajoutez ces règles à iptables:
    $ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
    $ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
  3. Créez un utilisateur mysql avec un accès depuis '%' qui signifie - de n'importe qui, à l'exclusion de localhost:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. Changez dans votre script l'adresse mysql-server en 172.17.0.1


À partir de la documentation du noyau :

route_localnet - BOOLEAN: Ne considérez pas les adresses de bouclage comme source ou destination martiennes lors du routage. Cela permet d'utiliser 127/8 à des fins de routage local (default FALSE).

11
Ray D

Solution pour Windows 10

Docker Community Edition 17.06.0-ce-win18 2017-06-28 (stable)

Vous pouvez utiliser le nom DNS de l'hôte docker.for.win.localhost pour le résoudre en adresse IP interne. (Avertissement certaines sources ont mentionné windows mais ce devrait être win)

Vue d'ensemble
Je devais faire quelque chose de similaire, à savoir connecter mon conteneur Docker à mon hôte local, qui exécutait les Azure Storage Emulator et CosmosDB Emulator.

Le Azure Storage Emulator par défaut écoute sur {127.0.0.1, alors que vous pouvez modifier l’adresse IP ainsi liée, j’étais à la recherche d’une solution qui fonctionnerait avec les paramètres par défaut.

Cela fonctionne également pour la connexion de mon conteneur Docker à SQL Server et IIS, les deux s'exécutant localement sur mon hôte avec les paramètres de port par défaut.

10
Ralph Willgoss

Pour ceux qui utilisent Windows, en supposant que vous utilisiez le pilote réseau pont, vous voudrez associer spécifiquement MySQL à l'adresse IP de l'interface réseau hyper-v. 

Cela se fait via le fichier de configuration situé dans le dossier C:\ProgramData\MySQL, normalement caché. 

La liaison à 0.0.0.0 ne fonctionnera pas. L'adresse nécessaire est également indiquée dans la configuration du menu fixe et, dans mon cas, était 10.0.75.1.

8
Casey

Edit: J'ai fini par prototyper le concept sur GitHub. Départ:https://github.com/sivabudh/system-in-a-box


Premièrement, ma réponse concerne deux groupes de personnes: ceux qui utilisent un Mac et ceux qui utilisent Linux.

Le mode réseau Host ne fonctionne pas sur un Mac. Vous devez utiliser un alias IP, voir: https://stackoverflow.com/a/43541681/2713729

Qu'est-ce qu'un mode réseau hôte? Voir: https://docs.docker.com/engine/reference/run/#/network-settings

Deuxièmement, pour ceux d'entre vous qui utilisent Linux (mon expérience directe était avec Ubuntu 14.04 LTS et je passe bientôt à 16.04 LTS en production), yes, vous pouvez rendre le service exécuté dans un conteneur Docker connecté à localhost services s'exécutant sur l'hôte Docker (par exemple, votre ordinateur portable).

Comment?

La clé est que lorsque vous exécutez le conteneur Docker, vous devez l'exécuter avec le mode Host. La commande ressemble à ceci:

docker run --network="Host" -id <Docker image ID>

Lorsque vous faites une ifconfig (vous devez apt-get install net-tools votre conteneur pour que ifconfig soit appelable) dans votre conteneur, vous verrez que les interfaces réseau sont les mêmes que celles de Docker Host (par exemple, votre ordinateur portable). 

Il est important de noter que je suis un utilisateur de Mac, mais que j'utilise Ubuntu sous Parallels, utiliser un Mac n'est donc pas un inconvénient. ;-)

Et voici comment vous connectez le conteneur NGINX à MySQL exécuté sur une localhost.

7
sivabudh

jusqu'à ce que Host.docker.internal fonctionne pour chaque plate-forme, vous pouvez utiliser mon conteneur en tant que passerelle NAT sans configuration manuelle https://github.com/qoomon/docker-Host

5
qoomon

La solution la plus simple pour Mac OSX

Utilisez simplement l'adresse IP de votre Mac. Sur le Mac, lancez ceci pour obtenir l'adresse IP et l'utiliser depuis le conteneur:

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

Tant que le serveur fonctionnant localement sur votre Mac ou dans un autre conteneur docker écoute 0.0.0.0, le conteneur docker pourra se connecter à cette adresse.

Si vous voulez juste accéder à un autre conteneur docker qui écoute sur 0.0.0.0, vous pouvez utiliser 172.17.0.1

4
dansalmo

Ce n'est pas une réponse à la question réelle. Voici comment j'ai résolu un problème similaire. La solution provient totalement de: Définir la mise en réseau du conteneur Docker afin que les conteneurs puissent communiquer . Merci à Nic Raboy

Laissons ceci ici pour les autres qui pourraient vouloir faire REST appels entre un conteneur et un autre. Répond à la question: que faut-il utiliser à la place de localhost dans un environnement de menu fixe?

Obtenez à quoi ressemble votre réseau docker network ls

Créer un nouveau réseau docker network create -d my-net

Démarrer le premier conteneur docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>

Vérifiez les paramètres réseau du premier conteneur docker inspect first_container. "Réseaux": devrait avoir 'my-net'

Démarrer le second conteneur docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>

Vérifiez les paramètres réseau pour le deuxième conteneur docker inspect second_container. "Réseaux": devrait avoir 'my-net'

ssh dans votre deuxième conteneur docker exec -it second_container sh ou docker exec -it second_container bash.

À l'intérieur du second conteneur, vous pouvez envoyer une requête ping au premier conteneur par ping first_container. De plus, vos appels de code tels que http://localhost:5000 peuvent être remplacés par http://first_container:5000

3
Shirish Hirekodi

Plusieurs solutions me viennent à l’esprit:

  1. Déplacez d'abord vos dépendances dans des conteneurs
  2. Rendez vos autres services accessibles de l'extérieur et connectez-vous avec eux avec cette adresse IP externe
  3. Exécutez vos conteneurs sans isolation réseau
  4. Évitez de vous connecter via le réseau, utilisez plutôt un socket monté en volume

La raison pour laquelle cela ne fonctionne pas immédiatement est que les conteneurs s'exécutent avec leur propre espace de noms réseau par défaut. Cela signifie que localhost (ou 127.0.0.1 pointant vers l'interface de bouclage) est unique par conteneur. Se connecter à ceci connectera au conteneur lui-même, et non aux services fonctionnant en dehors de docker ou à l'intérieur d'un autre conteneur.

Option 1 : Si votre dépendance peut être déplacée dans un conteneur, je le ferais d'abord. Cela rend votre pile d'applications portable alors que d'autres essayent d'exécuter votre conteneur sur leur propre environnement. Et vous pouvez toujours publier le port sur votre hôte, où d'autres services non migrés peuvent toujours l'atteindre. Vous pouvez même publier le port sur l'interface localhost de votre hôte de menu fixe pour éviter qu'il ne soit accessible de l'extérieur avec une syntaxe telle que: -p 127.0.0.1:3306:3306 pour le port publié.

Option 2 : il existe différentes manières de détecter l'adresse IP de l'hôte depuis l'intérieur du conteneur, mais chacune comporte un nombre limité de scénarios de travail. (par exemple, nécessitant Docker pour Mac). L’option la plus portable consiste à injecter votre adresse IP hôte dans le conteneur avec quelque chose comme une variable d’environnement ou un fichier de configuration, par exemple:

docker run --rm -e "Host_IP=$(ip r s 0/0 | awk '{print $3}')" ...

Cela nécessite que votre service écoute sur cette interface externe, ce qui peut poser un problème de sécurité. Pour d'autres méthodes permettant d'obtenir l'adresse IP de l'hôte depuis l'intérieur du conteneur, voir cet article .

Option 3 : L'exécution sans isolation de réseau, c'est-à-dire avec --net Host, signifie que votre application s'exécute sur l'espace de noms du réseau de l'hôte. Cela représente moins d'isolement pour le conteneur et signifie que vous ne pouvez pas accéder à d'autres conteneurs sur un réseau de dockers partagé avec DNS (vous devez utiliser des ports publiés pour accéder à d'autres applications conteneurisées). Mais pour les applications qui ont besoin d'accéder à d'autres services de l'hôte qui n'écoutent que sur 127.0.0.1 sur l'hôte, cette option peut être la plus simple.

Option 4 : divers services permettent également l'accès via un socket basé sur un système de fichiers. Ce socket peut être monté dans le conteneur en tant que volume monté par une liaison, vous permettant d'accéder au service Host sans passer par le réseau. Pour accéder au moteur de menu fixe, vous voyez souvent des exemples de montage de /var/run/docker.sock dans le conteneur (ce qui lui donne un accès racine à l'hôte). Avec mysql, vous pouvez essayer quelque chose comme -v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock puis vous connecter à localhost, que mysql convertit en utilisant le socket.

3
BMitch

Je ne suis pas d'accord avec la réponse de Thomasleveil.

Relier mysql à 172.17.42.1 empêchera d’autres programmes utilisant la base de données de l’hôte de l’atteindre. Cela ne fonctionnera que si tous vos utilisateurs de base de données sont dockerisés.

En liant mysql à 0.0.0.0, la base de données sera ouverte au monde extérieur, ce qui est non seulement une très mauvaise chose à faire, mais aussi contraire à ce que l’auteur de la question initiale veut faire. Il dit explicitement "Le MySql tourne sur localhost et n'expose pas un port au monde extérieur, donc c'est lié à localhost"

Répondre au commentaire de ivant

"Pourquoi ne pas lier mysql à docker0 également?"

Ce n'est pas possible. La documentation de mysql/mariadb indique explicitement qu'il n'est pas possible de se connecter à plusieurs interfaces. Vous ne pouvez vous lier qu'à 0, 1 ou à toutes les interfaces.

En conclusion, je n'ai trouvé aucun moyen d'atteindre la base de données (hôte local uniquement) sur l'hôte à partir d'un conteneur de menu fixe. Cela semble être un schéma très courant, mais je ne sais pas comment le faire.

2
orzel

Les CGroups et les namespaces jouent un rôle majeur dans l’écosystème des conteneurs.

Les espaces de noms fournissent une couche d'isolement. Chaque conteneur s'exécute dans un espace de noms distinct et son accès est limité à cet espace de noms. Les Cgroups contrôlent l'utilisation des ressources de chaque conteneur, tandis que Namespace contrôle ce qu'un processus peut voir et accéder à la ressource respective. 

Voici la compréhension de base de l’approche de la solution que vous pouvez suivre,

Utiliser un espace de noms réseau

Lorsqu'un conteneur apparaît en dehors de l'image, une interface réseau est définie et créée. Cela donne au conteneur une adresse IP et une interface uniques.

$ docker run -it Alpine ifconfig

En modifiant l'espace de nom en hôte, les réseaux cotainers ne restent pas isolés de son interface, le processus aura accès à l'interface réseau des machines hôtes.

$ docker run -it --net=Host Alpine ifconfig

Si le processus écoute sur les ports, ils seront écoutés sur l'interface hôte et mappés sur le conteneur.

Utiliser un espace de noms PID .__ En modifiant l’espace de noms Pid, ​​un conteneur peut interagir avec un autre processus au-delà de sa portée normale.

Ce conteneur s'exécutera dans son propre espace de noms.

$ docker run -it Alpine ps aux

En modifiant l'espace de noms sur l'hôte, le conteneur peut également afficher tous les autres processus en cours d'exécution sur le système.

$ docker run -it --pid=Host Alpine ps aux

Partage d'un espace de noms

Cela est une mauvaise pratique de le faire en production, car vous sortez du modèle de sécurité du conteneur, ce qui pourrait entraîner des vulnérabilités et un accès facile à une oreille indiscrète. Ceci ne concerne que les outils de débogage et minimise les lacunes en matière de sécurité des conteneurs.

Le premier conteneur est le serveur nginx. Cela créera un nouveau réseau et traitera l'espace de noms. Ce conteneur se lie au port 80 de la nouvelle interface réseau. 

$ docker run -d --name http nginx:Alpine

Un autre conteneur peut maintenant réutiliser cet espace de noms,

$ docker run --net=container:http mohan08p/curl curl -s localhost

En outre, ce conteneur peut voir l'interface avec les processus d'un conteneur partagé.

$ docker run --pid=container:http Alpine ps aux

Cela vous permettra d'accorder plus de privilèges aux conteneurs sans modifier ni redémarrer l'application. De la même manière, vous pouvez vous connecter à mysql sur Host, lancer et déboguer votre application. Mais, ce n'est pas recommandé d'y aller de cette façon. J'espère que ça aide. 

2
mohan08p

Vous pouvez obtenir l'ip de l'hôte en utilisant l'image Alpine

docker run --rm Alpine ip route | awk 'NR==1 {print $3}'

Ce serait plus cohérent puisque vous utilisez toujours Alpine pour exécuter la commande.

Semblable à la réponse de Mariano, vous pouvez utiliser la même commande pour définir une variable d'environnement

DOCKER_Host=$(docker run --rm Alpine ip route | awk 'NR==1 {print $3}') docker-compose up
2
hasnat

Pour la machine Windows: -

Exécutez la commande ci-dessous pour exposer le port du menu fixe de manière aléatoire pendant la phase de construction.

$docker run -d --name MyWebServer -P mediawiki

 enter image description here

 enter image description here

Dans la liste de conteneurs ci-dessus, vous pouvez voir le port attribué en tant que 32768. Essayez d'accéder à 

localhost:32768 

Vous pouvez voir la page mediawiki

1
Lokesh S

Très simple et rapide, vérifiez votre adresse IP hôte avec ifconfig (linux) ou ipconfig (windows), puis créez un

docker-compose.yml

version: '3' # specify docker-compose version

services:
  nginx:
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "8080:80" # specify port mapping
    extra_hosts:
      - "dockerhost:<yourIP>"

De cette façon, votre conteneur pourra accéder à votre hôte. Lorsque vous accédez à votre base de données, n'oubliez pas d'utiliser le nom que vous avez spécifié précédemment, dans le cas présent "dockerhost", ainsi que le port de votre hôte sur lequel la base de données s'exécute

1
Felipe Toledo

Jusqu'à ce que fix ne soit pas fusionné dans la branche master, pour que l'hôte IP s'exécute simplement depuis l'intérieur du conteneur:

ip -4 route list match 0/0 | cut -d' ' -f3

(comme suggéré par @Mahoneyici ).

0
patryk.beza

Aucune des réponses n’a fonctionné pour moi lors de l’utilisation de Docker Toolbox sous Windows 10 Home, mais 10.0.2.2 did, car elle utilise VirtualBox qui expose l’hôte à la VM de cette adresse.

0
Elad