connessione dal contenitore docker all'host docker


10

Ho una configurazione in cui eseguo tutte le parti del mio sito Web in contenitori docker. Il mio nginx che è in ascolto sulla porta 80 e 443 viene eseguito in un contenitore.

363292a98545        scivm/nginx-django-scivmcom:latest   /usr/bin/supervisord   12 days ago         Ghost               0.0.0.0:40001->22/tcp, 88.198.57.112:443->443/tcp, 88.198.57.112:80->80/tcp     lonely_feynmann           

Voglio impostare un proxy per un servizio in un altro contenitore. Questo contenitore è associato alla porta 3000 sull'host:

b38c8ef72d0a        mazzolino/strider-dind:latest        wrapdocker /usr/bin/   41 minutes ago      Up 41 minutes       0.0.0.0:3000->3000/tcp, 22/tcp, 27017/tcp                                       distracted_einstein      

I miei iptables sull'host docker si presentano così:

root@Ubuntu-1204-precise-64-minimal /var/run # iptables -L
Chain INPUT (policy ACCEPT) target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:8000
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Dall'interno del contenitore, non riesco a collegarmi alla porta 3000 sul computer host a causa della configurazione di iptables.

Non voglio aprire la porta 3000 a Internet pubblico.

C'è un modo per aprire un ponte diretto tra il contenitore e l'host sulla porta 3000?

O dovrei modificare i miei iptables per accettarli dalla gamma ip docker?

Risposte:


5

Tutto ciò che serve sono le funzionalità di collegamento di Docker [obsoleto]

Sbarazzati di tutte le cose complicate che hai provato a fare e inizia a utilizzare i contenitori con nome e quindi collegali tra loro.


Ho dato un'occhiata alle funzionalità di collegamento docker ma se ho capito bene ha alcuni problemi. 1. Se il bambino viene riavviato, otterrà un nuovo indirizzo IP. Quindi tutti i genitori di quel bambino dovrebbero essere riavviati anche per ottenere i nuovi varilabes di ambiente. 2. Devo aggiungere la logica alla mia applicazione per leggere quelle variabili di ambiente al fine di stabilire connessioni.
user3133475

Un contenitore riavviato ( docker restart your_container) dovrebbe conservare il suo indirizzo IP. Solo se esegui un nuovo contenitore basato su una determinata immagine, otterrà un nuovo IP ( docker run -d image command).
Elias Probst,

2
Questo era vero, ma almeno dalla finestra mobile 1.0 un "riavvio finestra mobile" fornisce al contenitore un nuovo indirizzo IP. Basta colpire questo in alcuni script che si basavano sul comportamento precedente dell'ip non cambiando.
jamshid,

1
Mentre penso che questa sia probabilmente la cosa giusta da fare per l'OP, sono venuto qui in cerca di una risposta alla domanda. ovvero come collegarsi a un servizio sull'host.
MC0e,

2

La risposta di Elias è corretta, ma il collegamento è lungo e confuso. Ecco un semplice riassunto:

Innanzitutto, esegui il contenitore a cui collegarti e chiamalo:

sudo docker run -d --name db training/postgres

Quindi eseguire l'altro contenitore, collegandolo al primo contenitore:

sudo docker run -d -P --name web --link db:db training/webapp python app.py

Viene inserito il collegamento dal primo contenitore al secondo contenitore /etc/hosts. Quindi puoi usarlo come un nome host. Per esempio:

sudo docker run --name web --link db:db training/webapp ping db
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.