J'ai un Nginx exécuté dans un conteneur Docker. J'ai un MySql exécuté sur le système hôte. Je souhaite me connecter à MySql depuis mon conteneur. MySql se lie uniquement au périphérique localhost.
Existe-t-il un moyen de se connecter à ce MySql ou à tout autre programme sur localhost à partir de ce conteneur Docker ?
Cette question est différente de "Comment obtenir l'adresse IP de l'hôte Docker à partir de l'intérieur du conteneur Docker" car l'adresse IP de l'hôte Docker peut être une IP publique ou une IP privée dans le réseau, qui peut ou peut ne pas être accessible depuis le conteneur Docker (je veux dire IP publique si hébergé sur AWS ou ailleurs). Même si vous disposez de l'adresse IP de l'hôte Docker, cela ne signifie pas que vous pouvez vous connecter à l'hôte Docker depuis le conteneur, car votre réseau Docker peut être un réseau superposé, un réseau hôte, un réseau pont, un réseau macvlan. , un réseau nul, etc., ce qui limite l'accessibilité du conteneur à cette adresse IP.
Disponible sur toutes les plateformes
Docker v 20.10 et supérieur (au 14 décembre 2020)
Utilisez votre adresse IP interne ou connectez-vous à un nom DNS spécial
host.docker.internal
qui sera résolu en adresse IP interne utilisée par l'hôte.Ceci est à des fins de développement et ne s'applique pas aux environnements de production en dehors de Docker Desktop.
Avertissement Linux
Pour activer cette fonctionnalité dansDockersous Linux, ajoutez
--add-host=host.docker.internal:host-gateway
à votre commandedocker
pour activer la fonctionnalité.Pour activer cette fonctionnalité dansDocker Composesous Linux, ajoutez la ligne suivante à la définition du conteneur :
Selon certains utilisateurs, le nom DNS spécial ne fonctionne que dans le réseau
bridge
bridge par défaut de Docker et non dans les réseaux personnalisés.Pour les anciennes versions macOS et Windows de Docker
Docker v 18.03 et supérieur (au 21 mars 2018)
Utilisez votre adresse IP interne ou connectez-vous à un nom DNS spécial
host.docker.internal
qui sera résolu en adresse IP interne utilisée par l'hôte.Le support Linux est en attentehttps://github.com/docker/for-linux/issues/264
Pour les anciennes versions macOS de Docker
Docker pour Mac v 17.12 à v 18.02
Idem que ci-dessus, mais en utilisant
docker.for.mac.host.internal
docker.for.mac.host.internal.Docker pour Mac v 17.06 à v 17.11
Idem que ci-dessus, mais utilisez plutôt
docker.for.mac.localhost
docker.for.mac.localhost.Docker pour Mac 17.05 et versions antérieures
Pour accéder à la machine hôte à partir d'un conteneur Docker, vous devez attacher un alias IP à votre interface réseau. Vous pouvez lier n'importe quelle adresse IP de votre choix, assurez-vous simplement que vous ne l'utilisez pas pour autre chose.
sudo ifconfig lo0 别名 123.123.123.123/24
sudo ifconfig lo0 alias 123.123.123.123/24Assurez-vous ensuite que votre serveur écoute sur l'adresse IP ci-dessus ou
127.0.0.1, il n'acceptera pas les connexions. Ensuite, pointez simplement votre conteneur Docker vers cette IP pour accéder à l'hôte !0.0.0.0
。如果它正在监听本地主机127.0.0.1
0.0.0.0. S'il écoute sur localhost
curl -X GET 123.123.123.123:3000 à l'intérieur du conteneur. L'alias sera réinitialisé à chaque redémarrage, créez donc un script de démarrage si nécessaire.curl -X GET 123.123.123.123:3000
Pour tester, vous pouvez exécuter quelque chose commeSolution et plus de documentation ici :https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
Éditeur :
Si vous utilisezDocker-for-macouDocker-for-Windows18.03+, utilisez l'hôte
host.docker.internal
(au lieu de127.0.0.1 dans votre chaîne de connexion).
Si vous utilisezDocker-for-Linux20.10.0+, vous pouvez également utiliser l'hôte
sihost.docker.internal
if您使用--add-host host.docker.internal:host-gateway
vous le lancez en utilisant le
--add-host host.docker.internal:host-gateway option Conteneur Docker, ou ajout de l'extrait de code suivant dans le fichier docker-compose.yml :Sinon, veuillez lire ci-dessous
docker run
命令中使用--network="host"
,然后 docker 容器中的127.0.0.1
TLDRUtilisez--network="host" dans la commandedocker run, puis p>127.0.0.1 dans le conteneur Docker pointera vers votre hôte Docker.
Remarque : ce mode n'est disponible que pour Docker sous Linux,
selon la documentation.
Remarques sur le mode réseau du conteneur Docker Docker proposedifférents modes réseau
docker0
lors de l'exécution de conteneurs. Selon le mode que vous choisissez, vous vous connecterez différemment à la base de données MySQL exécutée sur l'hôte Docker.docker run --network="bridge" (par défaut)
Docker crée un pont nommésudo ip addr show docker0
docker0 par défaut. L'hôte Docker et le conteneur Docker ont tous deux une adresse IP sur le pont.
Sur l'hôte Docker, entrezdocker0
网络接口上的 IP 地址为172.17.42.1
sudo ip addr show docker0 et vous obtiendrez un résultat comme ceci :
Donc, l'adresse IP de mon hôte Docker sur l'interface réseaudocker run --rm -it ubuntu:trusty bash
并在容器中输入ip addr show eth0
docker0 est
172.17.1.192
172.17.42.1.Maintenant, démarrez un nouveau conteneur et installez un shell dessus :
ip addr show eth0 pour savoir comment son interface réseau principale est défini : Ici, l'adresse IP de mon conteneur est 172.17.1.192. Visualisez maintenant la table de routage : Ainsi, l'adresse IP de l'hôte docker 172.17.42.1 est définie comme route par défaut et est accessible depuis votre conteneur.172.17.42.1
docker run --rm -it ubuntu:trusty bash et dans le conteneur, tapezdocker run --network="host"
Vous pouvez également exécuter le conteneur Docker et définir lesparamètres réseau sur
主机
。这样的容器将与 docker 主机共享网络堆栈,从容器的角度来看,localhost
(或127.0.0.1
)将引用 docker 主机。 p>Veuillez noter que tout port ouvert dans le conteneur Docker sera ouvert sur l'hôte Docker. Cela ne nécessite pas l'option
-p
或 -Pdocker run
.Configuration IP sur mon hôte docker :
Et les conteneurs Docker du modehost:
Comme vous pouvez le constater, l'hôte Docker et le conteneur Docker partagent exactement la même interface réseau et ont donc la même adresse IP.
Connectez-vous à MySQL depuis le conteneur
Mode Pont
Pour accéder à MySQL exécuté sur un hôte Docker à partir d'un conteneur enmode pont, vous devez vous assurer que le service MySQL écoute les connexions sur l'
172.17.42.1
adresse IP.Pour ce faire, assurez-vous d'avoir
bind-address = 172.17.42.1
或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 le conteneur :
Puis dans votre application, utilisez la variable d'environnement
DOCKER_HOST_IP
pour ouvrir une 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 est accessible depuis Internet ; assurez-vous de définir 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 vers127.0.0.1
>. Les processus exécutés sur l'hôte Docker qui souhaitent se connecter à MySQL doivent utiliser l'adresse IPbind-address = 172.17.42.1
,您的MySQL服务器将不会侦听与127.0.0.1
建立的连接>。在 docker 主机上运行的想要连接到 MySQL 的进程必须使用172.17.42.1
.Mode hôte
Pour accéder à MySQL exécuté sur un hôte docker depuis un conteneur en mode hôte, vous pouvez conserver
bind-address = 127.0.0.1
并连接到127.0.0.1
dans la configuration MySQL depuis votre conteneur :Remarque :Veuillez utiliser
mysql -h 127.0.0.1
,而不是mysql -h localhost
; sinon le client MySQL tentera de se connecter à l'aide d'un socket Unix.