conectando do contêiner do docker ao host do docker


10

Tenho uma configuração na qual executo todas as partes do meu site em contêineres de encaixe. Meu nginx que escuta nas portas 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           

Quero configurar um proxy para um serviço em outro contêiner. Este contêiner está vinculado à 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      

Minhas iptables no host do docker ficam assim:

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 contêiner, não consigo conectar à porta 3000 na máquina host devido à configuração do iptables.

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 minhas tabelas de ip para aceitar no intervalo de ip do docker?

Respostas:


5

Tudo que você precisa são os recursos de link do Docker [obsoletos]

Livre-se de todas as coisas complicadas que você tentou fazer e comece a usar contêineres nomeados e, em seguida, vincule-os.


Dei uma olhada nos recursos do link docker, mas se entendi corretamente, ele tem alguns problemas. 1. Se o filho for reiniciado, ele obterá um novo endereço IP. Então todos os pais dessa criança precisariam ser reiniciados também para obter o novo ambiente varilabes. 2. Preciso adicionar lógica ao meu aplicativo para ler essas variáveis ​​de ambiente para fazer conexões.
user3133475

Um contêiner reiniciado ( docker restart your_container) deve manter seu endereço IP. Somente se você executar um novo contêiner com base em uma determinada imagem, ele obterá um novo IP ( docker run -d image command).
Elias Probst

2
Isso costumava ser verdade, mas pelo menos a partir do docker 1.0, uma "reinicialização do docker" fornece ao contêiner um novo endereço IP. Basta acertar isso em alguns scripts que contavam com o comportamento anterior do ip não mudar.
Jamshid

1
Embora eu ache que essa é provavelmente a coisa certa a ser feita pelo OP, vim aqui procurando uma resposta para a pergunta apresentada. ou seja, como vincular a um serviço no host.
Mc0e

2

A resposta de Elias está correta, mas o link é longo e confuso. Aqui está um resumo simples:

Primeiro, execute o contêiner ao qual vincular e nomeie-o:

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 /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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.