Docker容器无法连接到其他容器的公开端口

Docker容器无法连接到其他容器的公开端口

我有两个未链接的 docker 容器(SMTP + webserver)。SMTP 容器向所有接口公开端口 25。(docker run -p 25:25 smtp)。我可以从外部访问它。

但是我的 Web 容器无法连接到 SMTP 的容器端口 25(通过主机的公共 IP 地址)。难道它不能连接到它吗?该端口已暴露给全世界。

此连接问题的技术原因是什么?


其他人在 reddit 上提问,但没有给出合理的答案。

答案1

如果容器不在同一docker 网络他们将无法直接沟通。

如果不使用旧语法,默认网络上的容器也无法进行通信--link(目前,请参阅)。由于您的不在链接上(正如您所提到的)并且我假设它们只是在默认的docker网络上,因此它们将无法直接交互。

由于您已在主机和 SMTP 容器之间设置了映射,因此您的 Web 容器应该能够通过 docker 主机的端口 25 与 SMTP 服务器通信。通过使用主机的公共地址,您的 Web 容器将能够与 SMTP 容器通信。

更新: 我编写了一个对我有用的测试用例,你能确认这在你的环境中不起作用吗?你可以随意将服务器端口更改为5000你想要的任何端口,但要确保替换所有实例。在客户端 app.py 中,在 big [YOUR PUBLIC IP]bit 中添加你的 IP。你不需要在你的机器上安装 python 来测试这个 -但 Alpine 图像只有约 80MB。

服务器

应用程序

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

构建docker build -t server:tobyd

运行docker run -d -p 5000:5000 server:tobyd

客户

应用程序

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

构建docker build -t client:tobyd

运行docker run -d --name client_tobyd client:tobyd

期望
docker logs client_tobyd应该cats打印10次。

相关内容