我遇到了一个奇怪的问题,即与在 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容器问题看起来也有点相似,但我认为它不适用,因为我在本地机器上操作。所以防火墙不应该成为问题(如果我错了,请纠正我)