Docker中已打开端口上的端口绑定与已关闭端口上的端口绑定有什么区别?

Docker中已打开端口上的端口绑定与已关闭端口上的端口绑定有什么区别?,docker,networking,port,Docker,Networking,Port,按如下方式启动busybox容器: docker容器运行-it--rm-p5000:5000 busybox 并在主机上尝试侦听端口5000(如果没有nc,请尝试netcat): nc-l-p5000 错误:无法设置侦听套接字(错误=-3) 现在更改顺序,如在主机上第一次开始侦听: nc-l-p5000 然后启动容器: docker container run -it --rm -p 5000:5000 busybox 为什么主机仍在侦听端口5000,而容器能够启动?为什么主机在第一种情

按如下方式启动busybox容器:

docker容器运行-it--rm-p5000:5000 busybox
并在主机上尝试侦听端口
5000
(如果没有nc,请尝试netcat):

nc-l-p5000
错误:无法设置侦听套接字(错误=-3)
现在更改顺序,如在主机上第一次开始侦听:

nc-l-p5000
然后启动容器:

docker container run -it --rm -p 5000:5000 busybox
为什么主机仍在侦听端口
5000
,而容器能够启动?为什么主机在第一种情况下不允许侦听端口
5000

我甚至可以使用主机本地IP(在我的例子中是192.168.0.10)从容器连接到主机:

/#telnet 192.168.0.10 5000
已连接到192.168.0.10

为什么我不能先用端口绑定启动容器,然后再开始侦听?

busybox容器中没有绑定到端口的进程。你只是在转发连接,而不是打开anything@cricket_007在第一种情况下,为什么主机拒绝侦听
5000
?我不确定,但我只是说,如果您希望两种方式都可以,您可以尝试使用另一个绑定到端口的容器fail@cricket_007我不想两者都失败,我试着让第一种情况也起作用。我希望在容器使用端口绑定启动后,能够监听主机上的端口。这很奇怪;-)如果docker和netcat使用不同的接口(每个接口都有一个
:5000
),那么这应该是唯一可行的方法,但情况似乎并非如此,因为您的第一个示例不会失败。如果我尝试重新编程,我可以正确地(!)使用netcat首先获取端口,但docker无法
bind:address ready in use
。而且,如果我反转命令,netcat将失败:
nc:Address已在使用中
。所以,我无法解释你观察到的行为。它应该像你想象的那样工作。对我来说是的。