我的主机上有一个守护程序在某个端口(例如8008)上运行,并且我的代码通常通过联系localhost:8008与守护程序进行交互。
我现在已经容器化了我的代码,但还没有守护程序。
如何将容器上的localhost:8008转发到运行该容器的主机上的localhost:8008(以及守护程序)。
以下是我的主机上的netstat -tlnp
。我希望容器将主机上的localhost:2009转发到主机上的localhost:2009
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2009 0.0.0.0:* LISTEN 22547/ssh
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 ::1:2009 :::* LISTEN 22547/ssh
最佳答案
因此,您需要考虑的方式是Docker容器具有自己的网络堆栈(除非您明确地告诉它与--net=host
共享主机的堆栈)。这意味着当与主机端口链接时,端口既需要暴露在docker容器内部,也需要暴露在外部(documentation)。容器上暴露的端口需要显式绑定(bind)到主机端口(在-p xxxx:yyyy
命令中使用docker run
)或隐式绑定(bind)(在Dockerfile中使用EXPOSE
并在命令行上使用-P
),就像它说here一样。如果您的Dockerfile不包含EXPOSE 8008
,或者您未在--expose 8008
命令中指定docker run
,则即使您随后在-p 8008:8008
命令中使用docker run
,您的容器也无法与外界对话!
因此,要在与容器上的tcp/8008链接的主机上获取tcp/8008,您需要在Dockerfile中添加EXPOSE 8008
(然后在容器中docker build
)或在--expose 8008
中添加docker run command
。另外,您需要使用-P
隐式地使用,或者使用-p 8008:8008
显式地将该暴露的容器端口链接到主机端口。执行此操作的示例docker run
命令如下所示:docker run -it --expose 8008 -p 8008:8008 myContainer
方便记住,在-p 8008:8008
命令行选项中,此操作的顺序为-p HOST_PORT:CONTAINER_PORT
。另外,不要忘记,除非您在主机的iptables中也解除了此端口的阻塞,否则您将无法从Internet上的另一台计算机SSH进入容器。我总是忘了这件事,浪费了半个小时,才记得我忘记为主机上的特定tcp端口添加iptables -A INPUT ...
了。但是,您应该能够在没有iptables规则的情况下从主机通过SSH进入容器,因为它使用环回进行本地连接。祝好运!
关于linux - 如何将容器上的localhost端口转发到主机上的localhost?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30109037/