2015-07-09 14 views
73

Ho un contenitore docker che esegue jenkins. Come parte del processo di compilazione, ho bisogno di accedere a un server web che viene eseguito localmente sul computer host. Esiste un modo in cui il server Web host (che può essere configurato per l'esecuzione su una porta) può essere esposto al contenitore jenkins?Come accedere alla porta host dal contenitore docker

EDIT: Sto eseguendo la finestra mobile in modo nativo su una macchina Linux.

UPDATE:

Oltre a @larsks risposta qui sotto, per ottenere l'indirizzo IP dell'host IP dal computer host, faccio la seguente:

ip addr show docker0 | grep -Po 'inet \K[\d.]+' 
+0

Utilizzare un commento poiché questa è una risposta terribile, ma credo che in genere si possa accedervi in ​​172.17.1.78 - a meno che non si tratti di un'installazione di boot2docker. – CashIsClay

+0

@CashIsClay Ho provato a farlo, e ho ancora questo errore 'arricciare: (7) Impossibile connettersi alla porta 172.17.1.78 7000: nessuna route per l'host' –

+0

Non hai specificato; stai usando boot2docker, o stai usando Docker nativamente su Linux? – larsks

risposta

84

Quando si esegue Docker nativamente su Linux , è possibile accedere ai servizi host utilizzando l'indirizzo IP dell'interfaccia docker0. Dall'interno del contenitore, questa sarà la tua rotta predefinita.

Per esempio, sul mio sistema:

$ ip addr show docker0 
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff 
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 
     valid_lft forever preferred_lft forever 
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
     valid_lft forever preferred_lft forever 

E all'interno di un contenitore:

# ip route show 
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0 src 172.17.0.4 

E 'abbastanza facile per estrarre questo indirizzo IP utilizzando un semplice shell script:

#!/bin/sh 

hostip=$(ip route show | awk '/default/ {print $3}') 
echo $hostip 

Potrebbe essere necessario modificare le regole iptables sul tuo host t o consentire connessioni da contenitori Docker. Qualcosa di simile a questo farà il trucco:

# iptables -A INPUT -i docker0 -j ACCEPT 

Ciò consentirebbe l'accesso a qualsiasi porta sull'host da Docker contenitori. Si noti che:

  • iptables regole sono ordinate, e questa regola può o non può fare la cosa giusta seconda di ciò che altre regole vengono prima di esso.

  • vi sarà solo in grado di accedere ai servizi di accoglienza che sono (a) ascolto su INADDR_ANY (aka 0.0.0.0) o che sono esplicitamente ascolto sull'interfaccia docker0.

+0

Grazie. Ottenere l'indirizzo IP era tutto ciò che era necessario per me, senza modificare l'iptables :) –

+0

Ho avuto lo stesso problema con la restituzione di No route to host, @TriNguyen cosa hai fatto dopo aver ottenuto l'IP dell'host per farlo funzionare? Grazie –

+0

@ mino.me che aspetto ha l'host per te? non esattamente sicuro del motivo per cui non funzionerebbe –

0

Quando sono già state create due immagini di finestra mobile e si desidera mettere due contenitori per comunicare l'uno con l'altro.

Per questo, è possibile eseguire comodamente ciascun contenitore con il proprio nome - e utilizzare il flag --link per abilitare la comunicazione tra di essi. Non lo ottieni durante la costruzione della finestra mobile.

Quando si è in uno scenario come me, ed è il tuo

docker build -t "centos7/someApp" someApp/ 

che si rompe quando si tenta di

curl http://172.17.0.1:localPort/fileIWouldLikeToDownload.tar.gz > dump.tar.gz 

e si rimane bloccata su "ricciolo/wget" ritorno no " percorso per ospitare ".

La ragione è la sicurezza impostata dalla finestra mobile che, per impostazione predefinita, vieta la comunicazione da un contenitore verso l'host o altri contenitori in esecuzione sul proprio host. Questo è stato abbastanza sorprendente per me, devo dire, ci si aspetterebbe che l'ecosistema delle macchine mobili in esecuzione su una macchina locale possano accedere senza problemi l'un l'altro senza troppi ostacoli.

La spiegazione per questo è descritta in dettaglio nella seguente documentazione.

http://www.dedoimedo.com/computers/docker-networking.html

due soluzioni rapide sono dati che consentono di muoversi abbassando giù per la sicurezza della rete.

L'alternativa più semplice è solo spegnere il firewall - o consentire a tutti. Ciò significa eseguire il comando necessario, che potrebbe essere systemctl stop firewalld, iptables -F o equivalente.

Spero che questa informazione ti aiuti.

+0

Proprio come una nota, '--link' è ora deprecato –

76

Soluzione per MacOS

Docker for Mac v 17.06 e al di sopra (giugno 2017)

Collegare alla speciale solo per Mac nome DNS docker.for.mac.localhost che risolverà l'indirizzo IP interno utilizzato dal il padrone di casa. (Grazie a utente @Kyr)

Docker for Mac 17.05 e al di sotto

Per accedere a computer host dal contenitore finestra mobile è necessario collegare un alias IP per l'interfaccia di rete. Puoi legare qualsiasi IP che desideri, ma assicurati di non utilizzarlo per nient'altro.

sudo ifconfig lo0 alias 123.123.123.123/24

quindi assicurarsi che si Server è in ascolto al IP di cui sopra o 0.0.0.0. Se è in ascolto su localhost 127.0.0.1, non accetterà la connessione.

Quindi basta puntare il contenitore docker su questo IP ed è possibile accedere al computer host!

Per testare è possibile eseguire qualcosa come curl -X GET 123.123.123.123:3000 all'interno del contenitore.

L'alias verrà ripristinato ad ogni riavvio in modo da creare uno script di avvio, se necessario.

Solution e maggiore documentazione qui: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

+0

Ho provato con successo questo. Non è necessario spegnere il firewall –

+12

A partire dal 17.06, a partire da giugno 2017, il loro consiglio è quello di connettersi allo speciale nome DNS solo per Mac 'docker.for.mac.localhost' che verrà risolto all'indirizzo IP interno utilizzato dal ospite! ... L'ho provato e funziona davvero! :) – Kyr

+0

Spot su risposta per utenti Mac come me. Grazie. Una cosa che non capisco è perché 'ip route show | awk '/ default/{print $ 3}' 'fornisce un IP e' docker.for.mac.localhost' è un altro. – dmmd

2

Uso --net="host" nel comando docker run, quindi localhost nel vostro contenitore finestra mobile punterà al vostro ospite finestra mobile.

Problemi correlati