2014-11-28 16 views
44

Sono in esecuzione in boot2docker 1.3.1.Come accedere al server Web del contenitore Docker dall'host

Possiedo un contenitore Docker che esegue un server Web tramite uwsgi --http :8080.

Se collego al contenitore, posso navigare sul sito Web utilizzando lynx http://127.0.0.1:8080, quindi so che il server funziona.

ho eseguito il mio contenitore con:

$ docker run -itP --expose 8080 uwsgi_app:0.2 

Ha i seguenti dati:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS      NAMES 
5248ad86596d  uwsgi_app:0.2  "bash"    11 minutes ago  Up 11 minutes  0.0.0.0:49159->8080/tcp cocky_hypatia 
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d 
172.17.0.107 

ho pensato che avrei potuto accedere a tale sito web dal mio ospite andando a http://172.17.0.107:49159.

Questo non funziona. Vedo semplicemente "collegamento ..." in Chrome, che non porta da nessuna parte.

Cosa sto sbagliando?

+0

Sei in esecuzione Boot2Docker su Mac o PC Windows? Ho intenzione di assumere Mac a causa del '$' – Bryan

+2

Mac, per fortuna – Anentropic

risposta

33

Ok, stupido me, ho trovato la risposta nella documentazione per boot2docker https://docs.docker.com/installation/mac/#container-port-redirection

avevo bisogno di utilizzare l'indirizzo IP del vm boot2docker, piuttosto che l'ip del contenitore, cioè

$ boot2docker ip 
192.168.59.103 

e sono in grado di navigare il mio sito dall'host al http://192.168.59.103:49159/

non avevo bisogno di aggiungere qualsiasi route sull'host

+1

Ah, non ho notato l'opzione -P. – Bryan

+2

Nel mio caso ho invertito le porte con l'opzione 'run -p'. '-p 80: 5000'. Questo mapperebbe la porta 5000 nel nostro contenitore alla porta 80 sul nostro host locale. Ho fatto il contrario. Vedere https://docs.docker.com/userguide/usingdocker/ – Maxence

+2

Questo ha risolto il mio problema dopo 1 giorno di risoluzione dei problemi – David

0

[EDIT: versione originale è stata ignorando la -P in questione]

Se si desidera ottenere ai contenitori senza dover 'pubblicare' la porta (che cambia il suo numero) c'è un buon run- attraverso here.

la chiave è questa linea:

sudo route -n add 172.17.0.0/16 172.16.0.11 

che dice al Mac come instradare alla rete privata all'interno del VirtualBox VM che i contenitori finestra mobile sono.

+0

aggiungendo che quella via non risolve per me. Mi chiedo cosa sia questo IP '172.16.0.11'? dovrebbe essere l'IP del mio contenitore? L'ho provato ma non funziona neanche – Anentropic

+0

Hai letto l'intero articolo? – Bryan

+0

Oppure questo: http: // viget.it/est/how-to-use-docker-on-os-x-the-missing-guide – Bryan

4

È possibile utilizzare l'opzione di mappatura della porta boot2docker -L, come descritto here.

Quindi, nel tuo caso sarebbe

boot2docker ssh -L 0.0.0.0:8080:localhost:8080 

e poi

docker run -it -p 8080:8080 uwsgi_app:0.2 

In questo modo, non è necessario utilizzare l'indirizzo IP del boot2docker: è possibile utilizzare localhost o il proprio indirizzo IP (e il contenitore docker è accessibile dall'esterno).

89

Estensione Anentropic'sanswer: boot2docker è la vecchia app per Mac e Windows, docker-machine è la nuova.

In primo luogo, elencare le vostre macchine:

$ docker-machine ls 

NAME  ACTIVE DRIVER  STATE  URL       SWARM 
default *  virtualbox Running tcp://192.168.99.100:2376 

Quindi selezionare una delle macchine (quella di default è chiamato default) e:

$ docker-machine ip default 

192.168.99.100 
+3

Risolti i miei problemi di Windows. –

+16

Queste informazioni sono ancora corrette nel 2016? Non ottengo risultati dall'esecuzione di 'docker-machine ls', anche se' docker ps' mostra le cose attualmente in esecuzione. – Trejkaz

+0

Funziona ancora per me sul mio Mac. Nessun messaggio di errore? Prova a installare di nuovo https://docs.docker.com/docker-for-mac//https://docs.docker.com/docker-for-windows/. Versioni precedenti necessarie per valutare alcune impostazioni della shell https://docs.docker.com/machine/get-started/. – HankCa

7

per trovare l'indirizzo IP del contenitore, è dovrebbe essere necessario NO installazioni aggiuntive:

docker inspect <container> 

Fornisce molte informazioni. grep per l'indirizzo IP.

1

Aveva lo stesso problema e nel mio caso stavo usando l'istanza di AWS EC2. Stavo provando con l'IP del contenitore che non funzionava. Quindi ho utilizzato l'IP pubblico effettivo dell'host AWS come IP, che ha funzionato.

+0

OMG. Ho perso così tanto tempo dietro a questo. Mi chiedo quale sia la ragione di questo comportamento –

0

Boot2docker non è aggiornato, ma è possibile che il problema persista su Docker per Windows o Mac, anche se lo stesso contenitore funziona su Linux. Un sintomo è che il tentativo di accedere a una pagina sul server all'interno del contenitore dà l'errore "non ha inviato alcun dato" in contrasto con "impossibile connettersi".

Se è così, potrebbe essere perché su Win/Mac il container host has its own IP, non è localhost come è su linux. Provate a lanciare Django su IP 0.0.0.0, che significa accettare connessioni da tutti gli IP, in questo modo:

python manage.py runserver 0.0.0.0:8000 

In alternativa, se è necessario assicurarsi che il server risponde solo alle richieste locali (come ad esempio dal proxy locale come nginx , apache o gunicorn) è possibile utilizzare l'IP dell'host restituito da hostname -i.

E assicurarsi di utilizzare -pport forwarding option correttamente nel comando docker run.

Supponendo che tutto funzioni correttamente, è possibile accedere al server su http://localhost in un browser in esecuzione sul computer host.

0

Come risolvere il problema su hosting applicazione su browser host locale

Per questo lancio il contenitore con il comando di seguito, nel mio caso è stato:

[[email protected] ~]# docker ps -a 
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS    NAMES 
1b81d8a0e3e1  centos:baseweb  "/bin/bash"   8 minutes ago  Exited (0) 24 seconds ago      webtest 
[[email protected] ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash 

Nella configurazione httpd:

[[email protected] /]# cd /etc/httpd/conf 
[[email protected] conf]# ll 
total 52 
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf 

modificare il file con la porta 8000 in listner e aggiornare l'ip del contenitore e la porta in Servername.

Riavviare il servizio httpd e il gioco è fatto.

Spero che questo aiuti

Problemi correlati