conectarse desde el contenedor docker al host docker

10

Tengo una configuración donde ejecuto todas las partes de mi sitio web en contenedores acoplables. Mi nginx que escucha en el puerto 80 y 443 se ejecuta en un contenedor.

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           

Quiero configurar un proxy para un servicio en otro contenedor. Este contenedor está vinculado al puerto 3000 en el 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      

Mis iptables en el host docker se ven así:

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         

Desde dentro del contenedor, no puedo conectarme al puerto 3000 en la máquina host debido a la configuración de iptables.

No quiero abrir el puerto 3000 a internet público.

¿Hay alguna manera de abrir un puente directo entre el contenedor y el host en el puerto 3000?

¿O debería modificar mis iptables para aceptar desde el rango de ip de Docker?

usuario3133475
fuente

Respuestas:

5

Todo lo que necesitas son las capacidades de enlace de Docker [en desuso]

Simplemente deshágase de todas las cosas complicadas que intentó hacer y comience a usar contenedores con nombre y luego vincúlelos entre sí.

Elias Probst
fuente
Eché un vistazo a las capacidades de enlace de Docker, pero si lo entiendo correctamente, tiene algunos problemas. 1. Si el niño se reinicia, obtendrá una nueva dirección IP. Entonces, todos los padres de ese niño tendrían que reiniciarse también para obtener el nuevo entorno varilabes. 2. Tengo que agregar lógica a mi aplicación para leer esas variables de entorno para hacer conexiones.
user3133475
Un contenedor reiniciado ( docker restart your_container) debería mantener su dirección IP. Solo si ejecuta un nuevo contenedor basado en una imagen dada, obtendrá una nueva IP ( docker run -d image command).
Elias Probst
2
Eso solía ser cierto, pero al menos a partir de docker 1.0 un "reinicio de docker" le da al contenedor una nueva dirección IP. Simplemente presione esto en algunos scripts que se basaron en el comportamiento anterior de la ip que no cambia.
jamshid
1
Si bien creo que esto es probablemente lo correcto para el OP, vine aquí buscando una respuesta a la pregunta. es decir, cómo vincular a un servicio en el host.
mc0e
2

La respuesta de Elias es correcta, pero el enlace es largo y confuso. Aquí hay un resumen simple:

Primero, ejecute el contenedor para vincular y asígnele el nombre

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

Luego ejecute el otro contenedor, vinculándolo al primer contenedor:

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

Se coloca el enlace del primer contenedor al segundo contenedor /etc/hosts. Entonces puedes usarlo como un nombre de host. Por ejemplo:

sudo docker run --name web --link db:db training/webapp ping db
Ron Romero
fuente