Tengo una configuración en la que ejecuto todas las partes de mi sitio web en contenedores acoplables. Mi nginx que escucha en los puertos 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 de la ventana acoplable 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 la Internet pública.
¿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 el rango de IP de Docker?
Respuesta1
Todo lo que necesitas es Dockercapacidades de enlace[obsoleto]
Simplemente deshazte de todas las cosas complicadas que intentaste hacer y comienza a usar contenedores con nombre y luego vincúlalos entre sí.
Respuesta2
La respuesta de Elías es correcta, pero el vínculo es largo y confuso. Aquí hay un resumen simple:
Primero, ejecute el contenedor al que desea 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
El enlace del primer contenedor al segundo contenedor se coloca en /etc/hosts
. Entonces puedes usarlo como un nombre de host. Por ejemplo:
sudo docker run --name web --link db:db training/webapp ping db