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é dans Docker sous Linux, ajoutez --add-host=host.docker.internal:host-gateway
à votre commande docker
pour activer la fonctionnalité.
Pour activer cette fonctionnalité dans Docker Compose sous Linux, ajoutez la ligne suivante à la définition du conteneur?:
extra_hosts: - "host.docker.internal:host-gateway"
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.
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 attente https://github.com/docker/for-linux/issues/264
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/24
Assurez-vous ensuite que votre serveur écoute sur l'adresse IP ci-dessus ou 0.0.0.0
。如果它正在監(jiān)聽(tīng)本地主機(jī)127.0.0.1
0.0.0.0. S'il écoute sur localhost
Ensuite, pointez simplement votre conteneur Docker vers cette IP pour accéder à l'h?te?!
curl -X GET 123.123.123.123:3000
Pour tester, vous pouvez exécuter quelque chose comme
L'alias sera réinitialisé à chaque redémarrage, créez donc un script de démarrage si nécessaire.
Solution et plus de documentation ici?: https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
??éditeur?:
Si vous utilisez Docker-for-mac ou Docker-for-Windows 18.03+, utilisez l'h?te host.docker.internal
(au lieu de 127.0.0.1 dans votre cha?ne de connexion).
Si vous utilisez Docker-for-Linux 20.10.0+, vous pouvez également utiliser l'h?te host.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 :extra_hosts: - "host.docker.internal:host-gateway"
docker run
命令中使用 --network="host"
,然后 docker 容器中的 127.0.0.1
TLDR
Utilisez --network="host" dans la commande docker run, puis p>127.0.0.1 dans le conteneur Docker pointera vers votre h?te Docker.
différents modes réseaudocker0
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)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. docker0
網(wǎng)絡(luò)接口上的 IP 地址為 172.17.42.1
sudo ip addr show docker0 et vous obtiendrez un résultat comme ceci?: docker run --rm -it ubuntu:trusty bash
并在容器中輸入 ip addr show eth0
[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 foreverDonc, l'adresse IP de mon h?te Docker sur l'interface réseau
docker0 est 172.17.1.192
172.17.42.1.
Maintenant, démarrez un nouveau conteneur et installez un shell dessus?: 172.17.42.1
docker run --rm -it ubuntu:trusty bash et dans le conteneur, tapez
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, l'adresse IP de mon conteneur est ??172.17.1.192. Visualisez 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 depuis 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
Vous pouvez également exécuter le conteneur Docker et définir les paramètres réseau sur 主機(jī)
。這樣的容器將與 docker 主機(jī)共享網(wǎng)絡(luò)堆棧,從容器的角度來(lái)看,localhost
(或127.0.0.1
)將引用 docker 主機(jī)。 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
或 -P docker run
.
Configuration IP sur mon h?te 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 les conteneurs Docker du 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 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.
Pour accéder à MySQL exécuté sur un h?te Docker à partir d'un conteneur en mode 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?:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print }')
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 vers 127.0.0.1
>. Les processus exécutés sur l'h?te Docker qui souhaitent se connecter à MySQL doivent utiliser l'adresse IP bind-address = 172.17.42.1
,您的MySQL服務(wù)器將不會(huì)偵聽(tīng)與127.0.0.1
建立的連接>。在 docker 主機(jī)上運(yùn)行的想要連接到 MySQL 的進(jìn)程必須使用 172.17.42.1
.
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?:
[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>
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.