Modifica: se stai usando Docker-per-mac o Docker-per-Windows 18.03+, connettiti al tuo servizio mysql usando l'host host.docker.internal
(invece che 127.0.0.1
nella stringa di connessione).
A partire da Docker 18.09.3, questo non funziona su Docker-for-Linux. Una correzione è stata inviata l'8 marzo 2019 e si spera che verrà unita alla base di codice. Fino ad allora, una soluzione alternativa consiste nell'utilizzare un contenitore come descritto nella risposta di Qoomon .
2020-01: sono stati compiuti alcuni progressi . Se tutto va bene, questo dovrebbe atterrare in Docker 20.04
TLDR
Utilizzare --network="host"
come docker run
comando, quindi 127.0.0.1
nel contenitore della finestra mobile verrà indicato l'host della finestra mobile.
Nota: questa modalità funziona solo su Docker per Linux, secondo la documentazione .
Nota sulle modalità di rete del contenitore docker
Docker offre diverse modalità di rete durante l'esecuzione di container. A seconda della modalità scelta, ti connetteresti al database MySQL in esecuzione sull'host docker in modo diverso.
docker run --network = "bridge" (impostazione predefinita)
Docker crea un bridge denominato docker0
per impostazione predefinita. Sia l'host docker che i contenitori docker hanno un indirizzo IP su quel bridge.
sull'host Docker, digitare sudo ip addr show docker0
si avrà un output simile a:
[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
Quindi qui il mio host docker ha l'indirizzo IP 172.17.42.1
sull'interfaccia di docker0
rete.
Ora avvia un nuovo contenitore e ottieni una shell su di esso: docker run --rm -it ubuntu:trusty bash
e all'interno del tipo di contenitore ip addr show eth0
per scoprire come è impostata la sua interfaccia di rete principale:
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
Qui il mio contenitore ha l'indirizzo IP 172.17.1.192
. Ora guarda la tabella di routing:
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
Pertanto, l'indirizzo IP dell'host docker 172.17.42.1
è impostato come route predefinita ed è accessibile dal contenitore.
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"
In alternativa è possibile eseguire un contenitore finestra mobile con le impostazioni di rete impostate suhost
. Tale contenitore condividerà lo stack di rete con l'host docker e dal punto di vista del contenitore localhost
(o 127.0.0.1
) farà riferimento all'host docker.
Tenere presente che qualsiasi porta aperta nel contenitore della finestra mobile verrà aperta sull'host della finestra mobile. E questo senza richiedere l' opzione -p
o-P
docker run
.
Configurazione IP sul mio host 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
e da un contenitore finestra mobile in modalità 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
Come puoi vedere, sia l'host docker che il container docker condividono esattamente la stessa interfaccia di rete e come tali hanno lo stesso indirizzo IP.
Connessione a MySQL dai contenitori
Modalità Ponte
Per accedere a MySQL in esecuzione sull'host docker da contenitori in modalità bridge , è necessario assicurarsi che il servizio MySQL sia in ascolto delle connessioni sull'indirizzo 172.17.42.1
IP.
Per fare ciò, assicurati di avere uno bind-address = 172.17.42.1
o bind-address = 0.0.0.0
nel tuo file di configurazione MySQL (my.cnf).
Se è necessario impostare una variabile di ambiente con l'indirizzo IP del gateway, è possibile eseguire il seguente codice in un contenitore:
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
quindi nella tua applicazione, usa la DOCKER_HOST_IP
variabile d'ambiente per aprire la connessione a MySQL.
Nota: se si utilizza bind-address = 0.0.0.0
il server MySQL, ascolterà le connessioni su tutte le interfacce di rete. Ciò significa che il tuo server MySQL potrebbe essere raggiunto da Internet; assicurarsi di impostare le regole del firewall di conseguenza.
Nota 2: se si utilizza bind-address = 172.17.42.1
il server MySQL non ascolterà le connessioni effettuate 127.0.0.1
. I processi in esecuzione sull'host docker che desiderano connettersi a MySQL dovrebbero utilizzare l' 172.17.42.1
indirizzo IP.
modalità host
Per accedere a MySQL in esecuzione sull'host docker da contenitori in modalità host , è possibile mantenere bind-address = 127.0.0.1
la configurazione MySQL e tutto ciò che è necessario fare è connettersi 127.0.0.1
dai contenitori:
[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>
nota: usare mysql -h 127.0.0.1
e non mysql -h localhost
; altrimenti il client MySQL proverebbe a connettersi usando un socket unix.