我的主机上有一个守护程序在某个端口(例如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/

10-10 12:36