Bearbeiten: Wenn Sie Docker-for-Mac oder Docker-for-Windows 18.03+ verwenden, stellen Sie einfach über den Host eine Verbindung zu Ihrem MySQL-Dienst her host.docker.internal
(anstelle der 127.0.0.1
in Ihrer Verbindungszeichenfolge).
Ab Docker 18.09.3 funktioniert dies unter Docker-for-Linux nicht mehr. Ein Fix wurde am 8. März 2019 eingereicht und wird hoffentlich in die Codebasis integriert. Bis dahin besteht eine Problemumgehung darin, einen Container zu verwenden, wie in der Antwort von qoomon beschrieben .
2020-01: Einige Fortschritte wurden erzielt . Wenn alles gut geht, sollte dies in Docker 20.04 landen
TLDR
Verwenden Sie --network="host"
in Ihrem docker run
Befehl, dann zeigt 127.0.0.1
in Ihrem Docker-Container auf Ihren Docker-Host.
Hinweis: Dieser Modus funktioniert laut Dokumentation nur unter Docker für Linux .
Hinweis zu den Docker-Container-Netzwerkmodi
Docker bietet verschiedene Netzwerkmodi beim Ausführen von Containern. Abhängig vom gewählten Modus stellen Sie eine unterschiedliche Verbindung zu Ihrer MySQL-Datenbank her, die auf dem Docker-Host ausgeführt wird.
Docker ausführen --network = "Brücke" (Standard)
Docker erstellt eine docker0
standardmäßig benannte Brücke . Sowohl der Docker-Host als auch die Docker-Container haben eine IP-Adresse auf dieser Bridge.
Geben sudo ip addr show docker0
Sie auf dem Docker-Host Folgendes ein: Die Ausgabe sieht folgendermaßen aus:
[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
Hier hat mein Docker-Host also die IP-Adresse 172.17.42.1
auf demdocker0
Netzwerkschnittstelle.
Starten Sie nun einen neuen Container und rufen Sie eine Shell auf: docker run --rm -it ubuntu:trusty bash
und innerhalb des Containertyps, ip addr show eth0
um herauszufinden, wie die Hauptnetzwerkschnittstelle eingerichtet ist:
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
Hier hat mein Container die IP-Adresse 172.17.1.192
. Schauen Sie sich nun die Routing-Tabelle an:
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
Daher wird die IP-Adresse des Docker-Hosts 172.17.42.1
als Standardroute festgelegt und kann von Ihrem Container aus aufgerufen werden.
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 ausführen --network = "Host"
Alternativ können Sie einen Docker-Container mit den Netzwerkeinstellungenhost
ausführen . Ein solcher Container teilt den Netzwerkstapel mit dem Docker-Host und aus der Sicht des Containers localhost
(oder127.0.0.1
verweist ) auf den Docker-Host.
Beachten Sie, dass jeder in Ihrem Docker-Container geöffnete Port auf dem Docker-Host geöffnet wird. Und das ohne das -p
oder-P
docker run
Option .
IP-Konfiguration auf meinem Docker-Host:
[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
und aus einem Docker-Container im Host- Modus:
[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
Wie Sie sehen können, haben sowohl der Docker-Host als auch der Docker-Container genau dieselbe Netzwerkschnittstelle und als solche dieselbe IP-Adresse.
Herstellen einer Verbindung zu MySQL über Container
Brückenmodus
Um von Containern im Bridge-Modus auf MySQL zuzugreifen, das auf dem Docker-Host ausgeführt wird , müssen Sie sicherstellen, dass der MySQL-Dienst auf Verbindungen mit der 172.17.42.1
IP-Adresse wartet.
Stellen Sie dazu sicher, dass Sie entweder bind-address = 172.17.42.1
oder bind-address = 0.0.0.0
in Ihrer MySQL-Konfigurationsdatei (my.cnf) haben.
Wenn Sie eine Umgebungsvariable mit der IP-Adresse des Gateways festlegen müssen, können Sie den folgenden Code in einem Container ausführen:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
Verwenden Sie dann in Ihrer Anwendung die DOCKER_HOST_IP
Umgebungsvariable, um die Verbindung zu MySQL herzustellen.
Hinweis: Wenn Sie bind-address = 0.0.0.0
Ihren MySQL-Server verwenden, wartet er auf Verbindungen auf allen Netzwerkschnittstellen. Das bedeutet, dass Ihr MySQL-Server über das Internet erreichbar ist. Stellen Sie sicher, dass Sie die Firewall-Regeln entsprechend einrichten.
Hinweis 2: Wenn Sie bind-address = 172.17.42.1
Ihren MySQL-Server verwenden, werden keine Verbindungen zu hergestellt 127.0.0.1
. Prozesse, die auf dem Docker-Host ausgeführt werden und eine Verbindung zu MySQL herstellen möchten, müssen die 172.17.42.1
IP-Adresse verwenden.
Host-Modus
Um von Containern im Host-Modus auf MySQL zuzugreifen, das auf dem Docker-Host ausgeführt wird , können Sie bind-address = 127.0.0.1
Ihre MySQL-Konfiguration beibehalten. Sie müssen lediglich eine Verbindung 127.0.0.1
von Ihren Containern aus herstellen:
[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>
Hinweis: Verwenden Sie mysql -h 127.0.0.1
und nicht mysql -h localhost
; Andernfalls würde der MySQL-Client versuchen, eine Verbindung über einen Unix-Socket herzustellen.