Depuis l'intérieur d'un conteneur Docker, comment puis-je me connecter à localhost de la machine?
J'ai donc un Nginx cours d'exécution à l'intérieur d'un conteneur docker, j'ai une base de données mysql en cours d'exécution sur localhost, je veux me connecter à MySql à partir de l'intérieur de mon Nginx. MySql est en cours d'exécution sur l'hôte local et de ne pas s'exposer à un port pour le monde extérieur, de sorte que son lié sur localhost, qui n'est pas lié à l'adresse ip de la machine.
Est-il possible de se connecter à ce MySql ou tout autre programme sur localhost à l'intérieur de ce conteneur docker?
- Pourquoi ne pas lier mysql pour docker0 ainsi?
- Pour Windows de la Machine :- $docker run-d --nom MyWebServer -P httpd
Vous devez vous connecter pour publier un commentaire.
Edit: Si vous utilisez Docker-pour-mac ou Docker-pour-Windows 18.03+, connectez-vous à votre service mysql à l'aide de l'hôte
host.docker.internal
.De Docker 18.09.3, cela ne fonctionne pas sur Docker-pour-Linux. Un fix a été soumis sur Mars le 8, 2019 et, nous l'espérons être fusionnés à la base de code. Jusqu'alors, une solution de contournement consiste à utiliser un conteneur comme décrit dans qoomon réponse.
TLDR
Utilisation
--network="host"
dans votredocker run
de la commande, puis127.0.0.1
dans votre conteneur docker va point à votre panneau d'accueil.Remarque: Ce mode ne fonctionne que sur Docker pour Linux, par la documentation.
Note sur docker conteneur de réseautage modes de
Docker propose les différents modes de mise en réseau lors de l'exécution de conteneurs. Selon le mode que vous choisissez de vous connecter à votre base de données MySQL en cours d'exécution sur le panneau d'accueil différemment.
docker run --réseau="pont" (par défaut)
Docker crée un pont nommé
docker0
par défaut. À la fois le panneau d'accueil et le menu fixe les conteneurs ont une adresse IP sur ce pont.sur le Panneau d'accueil, tapez
sudo ip addr show docker0
vous avez une sortie à la recherche comme:Alors, voici mon menu fixe de l'hôte est l'adresse IP
172.17.42.1
sur ledocker0
interface réseau.Maintenant commencer un nouveau conteneur et d'obtenir un shell sur elle:
docker run --rm -it ubuntu:trusty bash
et dans le type de conteneurip addr show eth0
de découvrir comment ses principaux interface réseau est mis en place:Ici mon container est l'adresse IP
172.17.1.192
. Maintenant, regardez la table de routage:Donc l'Adresse IP du panneau d'accueil
172.17.42.1
est définie comme route par défaut et est accessible à partir de votre conteneur.docker run --réseau="accueil"
Sinon, vous pouvez exécuter un conteneur docker avec les paramètres de réseau défini à
host
. Un tel conteneur partager la pile réseau avec le panneau d'accueil et à partir du conteneur de point de vue,localhost
(ou127.0.0.1
) va consulter le panneau d'accueil.Être conscient que tout port ouvert dans votre conteneur docker serait ouvert sur le panneau d'accueil. Et ce, sans exiger la
-p
ou-P
docker run
.IP config sur mon panneau d'accueil:
et à partir d'un conteneur docker dans hôte mode:
Comme vous pouvez le voir à la fois le panneau d'accueil et menu fixe conteneur de partager exactement la même interface réseau et ont la même adresse IP.
De la connexion à MySQL à partir de récipients
mode pont
Accéder à MySQL en cours d'exécution sur le panneau d'accueil à partir de récipients en mode pont, vous devez vous assurer que le service MySQL est à l'écoute pour les connexions sur la
172.17.42.1
adresse IP.De le faire, assurez-vous que vous avez
bind-address = 172.17.42.1
oubind-address = 0.0.0.0
dans votre fichier de configuration de MySQL (my.cnf).Si vous avez besoin de définir une variable d'environnement avec l'adresse IP de la passerelle, vous pouvez exécuter le code suivant dans un récipient :
puis dans votre application, utilisez la
DOCKER_HOST_IP
variable d'environnement pour ouvrir la connexion à MySQL.Remarque: si vous utilisez
bind-address = 0.0.0.0
votre serveur MySQL sera à l'écoute pour les connexions sur toutes les interfaces réseau. Cela signifie que votre serveur MySQL peut être atteint à partir de l'Internet ; assurez-vous de configurer le pare-feu règles en conséquence.Note 2: si vous utilisez
bind-address = 172.17.42.1
votre serveur MySQL de ne pas écouter les connexions127.0.0.1
. Les processus en cours d'exécution sur le panneau d'accueil qui serait prêt à se connecter à MySQL aurait à utiliser le172.17.42.1
adresse IP.mode hôte
Accéder à MySQL en cours d'exécution sur le panneau d'accueil à partir de récipients en mode hôte, vous pouvez garder
bind-address = 127.0.0.1
dans votre configuration de MySQL et tout ce que vous devez faire est de vous connecter à127.0.0.1
de vos contenants:remarque: utilisez
mysql -h 127.0.0.1
et pasmysql -h localhost
; sinon, le client MySQL serait tenter de se connecter en utilisant un socket unix.telnet 172.17.0.1 3306
-v /var/run/mysqld/mysqld.sock:/tmp/mysql.sock
cette.GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
docker.for.mac.host.internal
, ce qui résout l'adresse IP interne utilisé par l'hôte. sourcehost.docker.internal
comme un nom de domaine à partir du conteneur (selon la dernière mise à jour @Janne Annala 's répondre ). À l'avenir, qui semble être la plus générale de la solution lorsque vous voulez toujours un certain niveau d'isolation entre le conteneur et les réseaux de l'hôte.host.docker.internal
ne fonctionne pas pour Linux. Elle ne fonctionne que pour docker-pour-Windows et docker-pour-mac. Voir github.com/docker/for-linux/issues/264--net=host
pauses publié la traduction du port, de sorte que si le conteneur expose le port 80 (à l'aide de--publish XXX:80
ou plus simplement-p XXX:80
alors si un service sur l'ordinateur hôte est déjà lié au port 80 (docker instance ou d'un hôte natif de service), alors que le conteneur ne sera pas en mesure de lier le port 80. Il n'est donc pas bon dans n'importe quelle situation.ip addr show docker0
n'a pas besoin desudo
ip -4 addr show docker0 | awk '/inet .*\//{print $2}' | awk '{split($0,a,"/"); print a[1]}'
host.docker.internal
sur Linux a été soumise aujourd'hui. Il faut espérer être fusionnéexport ...
d'acquérir de la valeur actuelle (ailleurs).Pour macOS et Windows
Docker v 18.03 et au-dessus (depuis le 21 Mars 2018)
Utiliser votre adresse IP interne ou connectez-vous à la spéciale de nom DNS
host.docker.internal
qui permettra de résoudre l'adresse IP interne utilisé par l'hôte.Prise en charge de Linux dans l'attente de https://github.com/docker/for-linux/issues/264
MacOS avec les versions antérieures de Docker
Docker pour Mac v 17.12 à v 18.02
Même que ci-dessus mais l'utilisation
docker.for.mac.host.internal
à la place.Docker pour Mac v 17.06 à v 17.11
Même que ci-dessus mais l'utilisation
docker.for.mac.localhost
à la place.Docker pour Mac 17.05 et ci-dessous
Pour accéder à l'ordinateur hôte de la machine à partir du menu fixe conteneur, vous devez joindre une IP alias à votre interface réseau. Vous pouvez lier selon IP que vous voulez, assurez-vous juste que vous ne l'utilisez pas pour autre chose.
sudo ifconfig lo0 alias 123.123.123.123/24
Assurez-vous que le serveur est à l'écoute à l'adresse mentionnée ci-dessus ou
0.0.0.0
. Si elle est à l'écoute sur localhost127.0.0.1
il ne sera pas accepter la connexion.Puis il suffit de pointer votre conteneur docker à cette IP et vous pouvez accéder à la machine hôte!
De test, vous pouvez exécuter quelque chose comme
curl -X GET 123.123.123.123:3000
à l'intérieur du conteneur.L'alias sera remise à zéro à chaque redémarrage de créer un script de démarrage si nécessaire.
Solution et plus de la documentation ici: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
mysql -uroot -hdocker.for.mac.localhost
docker run -e HOSTNAME= docker.for.mac.host.internal
, le conteneur est créé mais nothign qui se passe. J'ai ensuite ctrl+C. Avec--net=host -e HOSTNAME=localhost
au moins le conteneur s'exécute et se plaint qu'il ne peut pas trouver le service dont j'ai besoin (db MySQL).Je fais un hack similaire à ci-dessus affiche d'obtenir l'adresse IP locale de la carte à un alias de nom (DNS) dans le récipient. Le problème majeur est d'obtenir dynamiquement avec un simple script qui fonctionne à la fois dans Linux et OSX l'adresse IP de l'hôte. J'ai fait ce script qui fonctionne dans les deux environnements (même en distribution Linux avec
"$LANG" != "en_*"
configuré):Donc, à l'aide de menu fixe la composition, la configuration complète sera:
Script de démarrage (docker-run.sh):
docker-composer.yml:
Puis changer
http://localhost
àhttp://dockerhost
dans votre code.Pour une avance plus guide comment personnaliser la
DOCKERHOST
script, prendre un coup d'oeil à ce post avec une explication de la façon dont il fonctionne.DOCKERHOST
de valeur ici, au lieu de "localhost" ou 0.0.0.0 dans n'importe quel service que votre conteneur docker a besoin pour se connecter localement.export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}')
Où <RÉSEAU-NAME> peut être pont ou le nom du réseau tel que défini par docker-composer (généralement chemin d'accès-nom-network_name).dockerhost
, car l'hôte de connexion db (généralement remplacer pourlocalhost
dans le fichier de config).Cela a fonctionné pour moi sur un NGINX/PHP-FPM pile sans toucher au code ou d'un réseau où l'application est juste, s'attendant à être en mesure de se connecter à
localhost
Mont
mysqld.sock
à partir de l'hôte à l'intérieur du conteneur.Trouver l'emplacement de la base de données mysql.chaussette fichier sur l'hôte exécutant mysql:
netstat -ln | awk '/mysql(.*)?\.sock/{ print $9 }'
Montez le fichier à l'endroit où il est attendu dans le menu fixe:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Les emplacements possibles de mysqld.chaussette:
Solution pour Linux (noyau >=3.6).
Ok, votre serveur localhost par défaut du panneau de l'interface docker0 avec adresse ip 172.17.0.1. Votre conteneur commencé avec les valeurs par défaut des paramètres réseau --net="pont".
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
$ 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
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
À partir de la documentation du noyau:
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 résoudre à l'adresse IP interne. (Attention certaines sources mentionnéeswindows
mais il devrait êtrewin
)Aperçu
J'avais besoin de faire quelque chose de similaire, c'est-à connecter à partir de mon conteneur Docker à mon localhost, qui était en cours d'exécution de la
Azure Storage Emulator
etCosmosDB Emulator
.La
Azure Storage Emulator
par défaut écoute sur 127.0.0.1, si l'on peut changer l'IP de sa limite trop, je cherchais une solution qui fonctionne avec les paramètres par défaut.Cela fonctionne aussi pour la connexion de mon conteneur Docker à
SQL Server
etIIS
, tous deux en local sur ma machine avec les paramètres par défaut du port.Jusqu'à
host.docker.internal
est de travailler pour chaque plate-forme, vous pouvez utiliser mon conteneur agissant comme une passerelle NAT sans aucune configuration manuelle:https://github.com/qoomon/docker-host
Pour ceux qui sont sur Windows, si vous utilisez le pont du pilote de réseau, vous aurez envie de se lier spécifiquement MySQL à l'adresse ip de la technologie hyper-v de l'interface réseau.
Cela se fait via le fichier de configuration en vertu de l'normalement cachés C:\ProgramData\MySQL dossier.
De liaison à 0.0.0.0 ne fonctionnera pas. L'adresse nécessaire est indiqué dans le panneau de configuration, et dans mon cas était 10.0.75.1.
Edit: j'ai fini de prototypage le concept sur GitHub. Découvrez: https://github.com/sivabudh/system-in-a-box
Tout d'abord, ma réponse est orienté vers les 2 groupes de personnes: ceux qui utilisent un Mac, et ceux qui utilisent Linux.
La hôte mode réseau ne fonctionne pas sur un Mac. Vous devez utiliser une adresse IP alias, voir: https://stackoverflow.com/a/43541681/2713729
Qu'est ce qu'un réseau hôte mode? Voir: https://docs.docker.com/engine/reference/run/#/network-settings
Deuxièmement, pour ceux d'entre vous qui sont à l'aide de Linux (mon expérience directe était avec Ubuntu 14.04 LTS et je me suis mise à niveau vers 16.04 LTS en production bientôt), oui, vous pouvez faire le service en cours d'exécution à l'intérieur d'un conteneur Docker se connecter à
localhost
services en cours d'exécution sur le Panneau d'accueil (par exemple. votre ordinateur portable).Comment?
La clé, c'est quand vous exécutez le Panneau de conteneur, vous devez l'exécuter avec la hôte mode. La commande ressemble à ceci:
docker run --network="host" -id <Docker image ID>
Lorsque vous faites une
ifconfig
(vous aurez besoin deapt-get install net-tools
votre conteneur pourifconfig
être appelable) à l'intérieur de votre conteneur, vous verrez que les interfaces réseau sont les mêmes que sur le Panneau d'accueil (par exemple. votre ordinateur portable).Il est important de noter que je suis un utilisateur de Mac, mais je exécuter Ubuntu sous Parallels, l'utilisation d'un Mac n'est pas un désavantage. 😉
Et ce est la façon dont vous vous connectez NGINX conteneur de la base de données MySQL en cours d'exécution sur un
localhost
.--network="host"
, comment se connecter à l'hôte mysql par exemple?localhost
. Découvrez mon GitHub le code source: github.com/sivabudh/system-in-a-box/blob/master/dj_host_docker/.... Recherche pour'HOST'
, vous verrez 127.0.0.1 pour se connecter à Postgresql.Solution la plus simple pour Mac OSX
Suffit d'utiliser l'adresse IP de votre Mac. Sur le Mac lancer pour obtenir l'adresse IP et l'utiliser à partir de l'intérieur du conteneur:
Tant que le serveur tourne en local sur votre Mac ou dans un autre conteneur docker est à l'écoute de 0.0.0.0, le docker conteneur sera en mesure d'atteindre à cette adresse.
Si vous voulez juste pour accéder à un autre menu fixe conteneur qui est à l'écoute sur 0.0.0.0 vous pouvez utiliser 172.17.0.1
docker.for.mac.host.internal
nom d'hôte maintenant.Je suis en désaccord avec la réponse de Thomasleveil.
Prise de mysql se lier à 172.17.42.1 permettra d'éviter d'autres programmes à l'aide de la base de données sur l'ordinateur hôte pour l'atteindre. Cela ne fonctionne que si tous les utilisateurs de base de données sont dockerized.
Prise de mysql se lier à 0.0.0.0 ouvrira la db à l'extérieur de monde, ce qui n'est pas seulement une très mauvaise chose à faire, mais aussi contrairement à ce que la question de départ, l'auteur veut faire. Il dit explicitement "Le MySql est en cours d'exécution sur l'hôte local et de ne pas s'exposer à un port pour le monde extérieur, de sorte que son lié sur localhost"
Pour répondre au commentaire de ivant
Ce n'est pas possible. Le mysql/mariadb documentation explicitement dit qu'il n'est pas possible de se lier à plusieurs interfaces. Vous ne pouvez lier à 0, 1, ou toutes les interfaces.
En conclusion, je n'ai PAS trouvé de moyen pour parvenir à la (localhost seulement) base de données sur l'ordinateur hôte à partir d'un conteneur docker. Qui semble définitivement comme un très très commun, mais je ne sais pas comment le faire.
172.17.42.1
adresse. Mais votre remarque est juste dans le cas contraire. Aso, j'ai édité ma réponse avec lehost
mode de mise en réseau qui permet de garder le serveur MySQL lié à127.0.0.1
tout en permettant conteneurs pour vous y connecter0.0.0.0
et ensuite mettre en place un pare-feu de sorte que le db n'est pas accessible depuis internet.Voici ma solution : il fonctionne pour mon cas
local mysql server pour l'accès du public en commentaire
#bind-address = 127.0.0.1
dans /etc/mysql/mysql.conf.d
redémarrer le serveur mysql
sudo /etc/init.d/mysql restart
exécutez la commande suivante pour ouvrir la racine de l'utilisateur l'accès à tout hôte
mysql -uroot -proot
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH
GRANT OPTION;
FLUSH PRIVILEGES;
créer sh script : run_docker.sh
courir avec docker-compositeur
Vous pouvez obtenir l'ip de l'hôte à l'aide alpin image
Ce serait plus cohérent que vous êtes toujours à l'aide alpin pour exécuter la commande.
Similaire à Mariano de réponse, vous pouvez utiliser la même commande pour définir une variable d'environnement
Aucune réponse n'a fonctionné pour moi lors de l'utilisation de Docker boîte à outils sur Windows 10 à la Maison, mais 10.0.2.2 fait, car il utilise VirtualBox, qui expose l'hôte de la machine virtuelle sur cette adresse.
Très simple et rapide, vérifiez votre hôte IP avec ifconfig (linux) ou ipconfig (windows), puis de créer un
docker-composer.yml
De cette façon, votre conteneur sera en mesure d'accéder à votre hôte. Lors de l'accès à votre base de données, n'oubliez pas d'utiliser le nom que vous avez spécifié avant, dans ce cas "dockerhost" et le port de votre hôte dans lequel la DB est en cours d'exécution
Les CGroups et les espaces de noms sont à jouer un rôle majeur dans le Conteneur de l'Écosystème.
Espace de noms de fournir une couche d'isolement. Chaque conteneur s'exécute dans un autre espace de noms et de ses accès est limité à l'espace de nom. Les Cgroups contrôles de l'utilisation des ressources de chaque conteneur, tandis que l'espace de Noms des contrôles de ce processus peut voir et accéder aux ressources.
Ici est la compréhension de base de l'approche de la solution que vous pourriez suivre,
Utiliser L'Espace De Noms Réseau
Lorsqu'un conteneur de fraie de l'image, une interface réseau est défini et de créer. Cela donne le conteneur unique adresse IP et l'interface.
Par la modification de l'espace de noms d'hôte, cotainers réseaux de ne pas rester isolé dans son interface, le processus auront accès à des ordinateurs hôtes d'interface réseau.
Si le processus est à l'écoute sur les ports, ils vont être écoutés sur l'interface de l'hôte et cartographiés sur le conteneur.
Utilisation PID espace de Noms
En changeant le Pid de l'espace de noms permet à un conteneur pour interagir avec d'autres processus au-delà de sa portée normale.
Ce conteneur s'exécute dans son propre espace de noms.
Par la modification de l'espace de noms de l'hôte, le conteneur peut également voir tous les autres processus en cours d'exécution sur le système.
Partage De L'Espace De Noms
C'est une mauvaise pratique de le faire dans la production parce que vous êtes briser le conteneur de modèle de sécurité qui peut ouvrir des failles, et un accès facile aux regards indiscrets. C'est seulement pour les outils de débogage et de minimiser les lacunes dans la sécurité des conteneurs.
Le premier conteneur est serveur nginx. Cela va créer un nouveau réseau et le processus de l'espace de noms. Ce conteneur va se lier lui-même vers le port 80 de la nouvellement créée de l'interface réseau.
Un autre récipient pouvez désormais réutiliser cet espace de noms,
Aussi, ce contenant peut le voir, l'interface avec les processus dans un conteneur partagé.
Cela permettra de vous donner plus de privilèges pour les conteneurs sans modification ou de redémarrer l'application. De la même manière, vous pouvez vous connecter à mysql sur l'hôte, l'exécution et le débogage de votre application. Mais, ce n'est pas recommander d'aller par ce chemin. Espérons que cela aide.
Plusieurs solutions me viennent à l'esprit:
La raison pour laquelle cela ne fonctionne pas hors de la boîte, c'est que les conteneurs de courir avec leur propre réseau de l'espace de noms par défaut. Cela signifie que localhost (ou 127.0.0.1 pointant vers l'interface de bouclage (loopback) est unique par conteneur. La connexion à ce connecter le conteneur lui-même, et non les services fonctionnant en dehors de menu fixe ou à l'intérieur d'un autre conteneur docker.
Option 1: Si votre dépendance peut être déplacé dans un récipient, je voudrais faire cela en premier. Il permet à votre application de pile portable, comme les autres, essayez d'exécuter votre récipient sur leur propre environnement. Et vous pouvez toujours publier le port sur votre hôte où d'autres services qui n'ont pas été migrés peut encore atteindre. Vous pouvez même publier le port de l'interface localhost sur votre panneau d'accueil afin d'éviter qu'il soit accessible de l'extérieur avec une syntaxe du type:
-p 127.0.0.1:3306:3306
pour le port publié.Option 2: Il existe une variété de façons pour détecter l'adresse IP de l'hôte à partir de l'intérieur du conteneur, mais ont chacun un nombre limité de scénarios où ils travaillent (par exemple, demander à Docker pour Mac). La plupart des portables option consiste à injecter de votre IP de l'hôte dans le récipient avec quelque chose comme une variable d'environnement ou le fichier de configuration, par exemple:
Ce n'exigent que votre service est à l'écoute sur l'interface externe, ce qui pourrait être un problème de sécurité. Pour d'autres méthodes pour obtenir l'adresse IP de l'hôte à partir de l'intérieur du conteneur, voir ce post.
Option 3: en cours d'Exécution sans l'isolement du réseau, c'est à dire en cours d'exécution avec
--net host
, signifie que votre application est en cours d'exécution sur l'hôte espace de noms réseau. C'est moins d'isolement pour le conteneur, et cela signifie que vous ne pouvez pas accéder à d'autres contenants de plus de partagé docker réseau avec DNS (au lieu de cela, vous avez besoin d'utiliser publiés ports pour accéder à d'autres conteneurs d'applications). Mais pour les applications qui ont besoin d'accéder à d'autres services sur la machine qui ne sont à l'écoute sur127.0.0.1
sur l'ordinateur hôte, ce peut être l'option la plus facile.Option 4: les Différents services permettent également l'accès sur un système de fichiers basé sur le socket. Ce support peut être monté dans le conteneur comme une liaison monté le volume, vous permettant d'accéder à l'hôte de service sans aller sur le réseau. Pour l'accès au support moteur, vous verrez souvent des exemples de montage
/var/run/docker.sock
dans le récipient (en donnant le conteneur racine de l'accès à l'hôte). Avec mysql, vous pouvez essayer quelque chose comme-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock
et puis connectez-vous àlocalhost
qui mysql convertit à l'aide de la douille.Ce n'est pas une réponse à la question. Voilà comment j'ai résolu un problème similaire. La solution est totalement à partir de: Définir Docker Conteneur de Réseautage afin de Conteneurs peuvent Communiquer. Grâce à la carte Raboy
Laissant ici pour d'autres qui veulent faire des appels de REPOS entre un conteneur et de l'autre. Répond à la question: ce qu'il faut utiliser à la place de localhost dans un docker de l'environnement?
Comment votre réseau ressemble à
docker network ls
Créer un nouveau réseau
docker network create -d my-net
Commencer le premier conteneur
docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>
Vérifier les paramètres réseau pour le premier conteneur
docker inspect first_container
. "Réseaux": doit avoir " mon " filet deDébut de la deuxième conteneur
docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>
Vérifier les paramètres réseau pour la deuxième conteneur
docker inspect second_container
. "Réseaux": doit avoir " mon " filet dessh dans votre deuxième conteneur
docker exec -it second_container sh
oudocker exec -it second_container bash
.À l'intérieur de la deuxième conteneur, vous pouvez faire un ping sur le premier conteneur par
ping first_container
. Aussi, votre code d'appels tels quehttp://localhost:5000
peut être remplacé parhttp://first_container:5000
Pour Windows De La Machine :-
Exécutez la commande ci-dessous pour Exposer docker du port au hasard pendant le temps de construction
Dans le conteneur au-dessus de la liste, vous pouvez voir le port affecté comme 32768. Essayez d'accéder à
Vous pouvez voir la page mediawiki
Jusqu'à fix n'est pas fusionné dans
master
branche, pour obtenir l'IP de l'hôte il suffit d'exécuter à partir de l'intérieur du conteneur:(comme suggéré par @Mahoney ici).
Vous pouvez utiliser ngrok pour créer un tunnel sécurisé pour votre localhost machine, puis exposer que le tunnel pour votre conteneur docker.
ngrok est libre d'utiliser comme de 05/22/2017.
Suit:
1) aller à ngrok
2) télécharger la ngrok client et suivre les instructions d'installation
3) INSCRIVEZ - pour un compte et ils vont fournir un jeton d'authentification. La signature est requise, car ngrok seulement vous donner le port tcp tunnel après la signature. Il n'y a pas de coût ou de carte de crédit requis pour s'inscrire.
4) dans votre terminal ne
ngrok tcp 3306
.3306
est le port que mysql fonctionne sur mon local, vous pouvez le faire avec n'importe quel autre port.5), Vous recevrez une adresse à partir de l'étape
4
comme ceci:tcp://0.tcp.ngrok.io:10117
. C'est le tunnel de connexion à votre ordinateur local.0.tcp.ngrok.io
est mappé à votrelocalhost
et port10117
est connecté à votre port local3306
. Maintenant, vous pouvez accéder à votre localhost port 3306 de n'importe où à l'aide de cette adresse, y compris les tout conteneur docker sur cette machine. Dans votre conteneur docker(où il est), en supposant que vous avez mysql client déjà installé, procédez de la manière suivante:mysql --host 0.tcp.ngrok.io --port 10117 -u root
Vous serez en mesure de vous connecter à votre
root
compte de votre ordinateur local à partir de l'intérieur du conteneur docker!J'ai blogué à propos de cette solution voir plus de détails ici