O contêiner do Docker não pode se conectar à porta pública exposta do outro contêiner

2

Eu tenho dois contêineres docker que não estão vinculados (SMTP + webserver). O contêiner SMTP expõe a porta 25 a todas as interfaces. (%código%). Eu posso alcançá-lo de fora.

Meu contêiner da Web não pode se conectar à porta 25 do contêiner do SMTP (por meio do endereço IP público do host). Não deveria ser capaz de se conectar a ele? O porto está exposto ao mundo.

Qual é o motivo técnico para esse problema de conexão?

Alguém perguntou isso no reddit , mas nenhuma resposta sensata foi dada lá.

    
por cweiske 04.04.2017 / 09:36

1 resposta

0

Se os contêineres não estiverem na mesma rede de estivadores , eles ganharão ' t ser capaz de se comunicar diretamente.

Os contêineres na rede padrão não podem se comunicar sem usar a antiga sintaxe --link (atualmente, consulte isto ). Como os seus não estão vinculados (como você mencionou) e presumo que estão apenas na rede docker padrão, eles não poderão interagir diretamente.

O contêiner da Web deve conseguir se comunicar com o servidor SMTP por meio da porta 25 do host do docker, já que você configurou esse mapa entre o host e o contêiner SMTP. Ao usar o endereço público do host, seu contêiner da Web poderá se comunicar com o contêiner de SMTP.

Atualização: Eu escrevi um caso de teste que funciona para mim, você poderia confirmar que isso não funciona em seu ambiente. Sinta-se à vontade para alterar as portas do servidor de 5000 para qualquer coisa que você deseje, certificando-se de substituir todas as instâncias. No cliente app.py, adicione seu IP no grande [YOUR PUBLIC IP] bit. Você não precisa do python em sua máquina para testar isso - mas a imagem alpina é de apenas 80MB.

Servidor

app.py

from xmlrpc import server

serv = server.SimpleXMLRPCServer(('0.0.0.0', 5000))

 def echo(word):
    return "echo: {}".format(word)

serv.register_function(echo)
serv.serve_forever()

Dockerfile

FROM python:3-alpine
WORKDIR /app
COPY app.py .
EXPOSE 5000
ENTRYPOINT python app.py

Construa com docker build -t server:tobyd

Executar com docker run -d -p 5000:5000 server:tobyd

Cliente

app.py

from xmlrpc import client
proxy = client.ServerProxy('http://[YOUR PUBLIC IP]:5000')

for i in range(10):
    print(proxy.echo('cats'))

Dockerfile

FROM python:3-alpine
WORKDIR /app
COPY app.py .
ENTRYPOINT python app.py

Construa com docker build -t client:tobyd

Executar com docker run -d --name client_tobyd client:tobyd

Expectativas
docker logs client_tobyd deve ter cats impresso 10 vezes.

    
por 04.04.2017 / 14:52