与 docker 容器的 TCP 连接不成功

问题描述 投票:0回答:1

我遇到了一个奇怪的问题,即与在 docker 中运行的服务器的简单 tcp 连接,我不明白也不知道如何继续。

我在 Windows 上运行并使用 Docker-Desktop。

服务器是一个简单的Python脚本,它的启动如下:

import socket
from datetime import datetime, timedelta

# listen to tcp on port 27279
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 27279))
s.listen(1)

print("Server is listening")

conn, addr = s.accept()

print(f"Connection from {addr} has been established")

该脚本在 docker 容器中运行,该容器以

docker run -p 27180:27279 -it my-image

容器日志中显示

Server is listening
并且 netstat 确认它确实正在监听该端口。

# netstat -plant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:27279         0.0.0.0:*               LISTEN      1/python

当我尝试使用

PS C:\WINDOWS\system32> ncat localhost 27180
从本地计算机连接到它时 什么都没发生。 在wireshark(edgeshark)中我可以看到以下几行

来源 目的地 协议 信息
172.17.0.1 172.17.0.2 TCP 60394 -> 27279 [SYN]
172.17.0.2 172.17.0.1 TCP 27279 -> 60394 [RST,ACK]

我的解释是端口映射是正确的,但连接被拒绝。

我也很高兴获得有关测试/检查内容的任何提示或任何需要阅读的资源以更好地理解问题。

到目前为止我尝试过的/相关问题

当我在本地计算机的容器外部运行相同的脚本时,它可以正常工作:

ncat localhost 27279
(注意不同的端口,因为在这种情况下显然没有端口映射)它工作正常,产生以下日志:

Server is listening
Connection from ('127.0.0.1', 18562) has been established

我希望 docker 内部有同样的行为。

我认为我的设置与Docker 如何在特定端口(8080)上建立到容器的 TCP 连接?中提出的解决方案非常相似,只是它不起作用。

我尝试重新启动容器和计算机,以防出现任何悬空连接,但没有效果。

我还考虑了通过tcp连接到docker容器时连接被外部主机关闭中提供的解决方案。现在wireshark中显示的IP地址是

127.26.9.1
,问题仍然存在。

这个无法远程连接到docker容器问题看起来也有点相似,但我认为它不适用,因为我在本地机器上操作。所以防火墙不应该成为问题(如果我错了,请纠正我)

docker tcp
1个回答
0
投票

Docker默认的网络模式是桥接模式。根据他们的文档创建了一个“软件桥”。

它还做的是,它为每个容器创建一个网络命名空间和连接到此桥的虚拟接口。每个容器都有一个单独的环回(localhost),即使使用

-p
选项也不会路由。

您必须通过将绑定调用更改为

s.bind(('0.0.0.0', 27279))
来更改脚本以侦听所有接口。这将使脚本侦听它自己的虚拟接口,这是 Docker 将发布的端口路由到的地方。

© www.soinside.com 2019 - 2024. All rights reserved.