Tudo o que você precisa são os recursos de link do Docker.
Apenas se livre de todas as coisas complicadas que você tentou fazer e comece a usar contêineres nomeados e, em seguida, vincule-os um ao outro.
Eu tenho uma configuração onde executo todas as partes do meu site em contêineres do Docker. Meu nginx que escuta na porta 80 e 443 é executado em um contêiner.
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
Eu quero configurar um proxy para um serviço em outro contêiner. Este contêiner está ligado à porta 3000 no 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
Meus iptables no host do docker se parecem com isso:
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
De dentro do container, não consigo me conectar à porta 3000 na máquina host devido à configuração do iptables.
Eu não quero abrir a porta 3000 para a Internet pública.
Existe uma maneira de abrir uma ponte direta entre o contêiner e o host na porta 3000?
Ou devo modificar meus iptables para aceitar do intervalo de ip do docker?
Tudo o que você precisa são os recursos de link do Docker.
Apenas se livre de todas as coisas complicadas que você tentou fazer e comece a usar contêineres nomeados e, em seguida, vincule-os um ao outro.
A resposta de Elias está correta, mas o link é longo e confuso. Aqui está um resumo simples:
Primeiro, execute o contêiner para vinculá-lo e nomeá-lo:
sudo docker run -d --name db training/postgres
Em seguida, execute o outro contêiner, vinculando-o ao primeiro contêiner:
sudo docker run -d -P --name web --link db:db training/webapp python app.py
O link do primeiro contêiner para o segundo contêiner é colocado em /etc/hosts
. Então você pode usá-lo como um nome de host. Por exemplo:
sudo docker run --name web --link db:db training/webapp ping db
Tags networking docker