Accedi al database host da un contenitore finestra mobile


131

Se ho un database mysql in esecuzione su un computer host e quell'host esegue anche un contenitore docker: Come accederei al database mysql dal contenitore docker in esecuzione sull'host ?.

Ad esempio, c'è un modo per pubblicare una porta host nel contenitore (il contrario di ciò che la finestra mobile esegue -p fa)?


1
Se il server MySQL è in ascolto su una porta, il contenitore non potrebbe semplicemente connettersi all'host su quella porta come qualsiasi altra connessione Internet?
jwodder,

Risposte:


87

Ci sono diverse discussioni di lunga data su come farlo in modo coerente, ben compreso e portatile. Nessuna risoluzione completa, ma ti collegherò alle discussioni seguenti.

In ogni caso, molti desiderano provare a utilizzare l'opzione --add-host per eseguire la finestra mobile per aggiungere l'indirizzo IP dell'host nel file / etc / host del contenitore. Da lì è banale connettersi all'host su qualsiasi porta richiesta:

Aggiunta di voci a un file host del contenitore

Puoi aggiungere altri host nel file / etc / hosts di un container usando uno o più flag --add-host. Questo esempio aggiunge un indirizzo statico per un host chiamato docker:

 $ docker run --add-host=docker:10.180.0.1 --rm -it debian
    $$ ping docker
    PING docker (10.180.0.1): 48 data bytes
    56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms
    56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms
    ^C--- docker ping statistics ---
    2 packets transmitted, 2 packets received, 0% packet loss
    round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms

Nota: a volte è necessario connettersi all'host Docker, il che significa ottenere l'indirizzo IP dell'host. È possibile utilizzare i seguenti comandi di shell per semplificare questo processo:

 $ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'"
 $ docker run  --add-host=docker:$(hostip) --rm -it debian

Documentazione:

https://docs.docker.com/engine/reference/commandline/run/

Discussioni sull'accesso all'host dal contenitore:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023


Funzionerà anche dietro un proxy inverso NGINX ??
kta,

89

Dai documenti del 18.03:

Voglio connettermi da un contenitore a un servizio sull'host

L'host ha un indirizzo IP che cambia (o nessuno se non si ha accesso alla rete). Dal 18.03 in poi la nostra raccomandazione è quella di connettersi al nome DNS speciale host.docker.internal, che si risolve nell'indirizzo IP interno utilizzato dall'host.

Il gateway è anche raggiungibile come gateway.docker.internal.

ESEMPIO: Ecco cosa uso per la mia stringa di connessione MySQL nel mio contenitore per accedere all'istanza MySQL sul mio host:

mysql://host.docker.internal:3306/my_awesome_database

31
Proprio come suggerimento: questo funziona solo per Mac e Win finora
flp

mi hai salvato la giornata :)
amjad,

4
Upvote. Non solo per la risposta, ma perché dovresti COME usarlo con un esempio.
granadaCoder

Ho quasi impiegato 2 ore per raggiungere questo obiettivo, grazie mille.
Ashish Bainade,

Ancora nessun supporto per Linux come ha scritto @flp, per i curiosi. Ecco il problema di github .
GAltelino,


24

Utilizzare host.docker.internal dalla Docker dal 18.03 in poi.


2
Come ? puoi fare un esempio di come usarlo?
danfromisrael,

Perché non esegui un mysql dockerizzato?
Igor De Oliveira Sá

non funziona per me aDocker version 18.03.0-ce, build 0520e24
scythargon l'

@ IgorDeOliveiraSá immagina di seguire il seguente scenario, in ambiente di sviluppo hai un database che ascolta 127.0.0.1:3306 su env di produzione hai database che ascolta 127.0.0.1:3306, localmente è il db locale, la produzione è proxy su cloud, devi docker mysql localmente e e per la produzione trovare un'altra soluzione, oppure puoi semplicemente connetterti da docker a port, funzionerà per entrambi i casi
Drachenfels

1
docker.for.mac.localhost funziona per me su18.03.1-ce-mac65
cdignam

21

Altre risposte non hanno funzionato bene per me. Il mio contenitore non è stato in grado di risolvere l'IP host utilizzando host.docker.internal . Ci sono due modi

  1. Condivisione della rete host --net = host:

    docker run -it --net=host  myimage
    
  2. Utilizzando l'indirizzo IP della docker , che di solito è 172.17.0.1 . Puoi verificarlo chiamando il comando ifconfig e afferrando inet addr dell'interfaccia docker

    user@ubuntu:~$ ifconfig
    docker0   Link encap:Ethernet  HWaddr 02:42:a4:a2:b2:f1  
      inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
    

Una volta che hai questo indirizzo IP, puoi passarlo come argomento alla finestra mobile e quindi all'applicazione o mentre lo faccio, mappare la posizione di jdbc.properties tramite volume alla directory sul computer host, in modo da poter gestire il file esternamente .

  docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage

NOTA: il database potrebbe non consentire connessioni esterne. In caso di postgresql, è necessario modificare 2 file, come descritto qui e qui :

  1. Modifica postgresql.conf per ascoltare su tutti gli indirizzi. Per impostazione predefinita punterà a localhost.

    listen_addresses = '*'
    
  2. Modifica pg_hba.conf per consentire connessioni da tutti gli indirizzi. Aggiungi sull'ultima riga:

    host     all             all             0.0.0.0/0               md5
    

IMPORTANTE: l'ultimo passaggio per l'aggiornamento dell'accesso al database non è raccomandato per l'uso in produzione a meno che non si sia veramente sicuri di ciò che si sta facendo.


--net = host ha funzionato per me in un ambiente CI, grazie mille!
Samy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.