linux – 如何将容器上的localhost端口转发到主机上的localhost?

我的主机上有一个守护进程在某个端口上运行(即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)暴露.容器上公开的端口需要显式绑定到主机端口(在docker run命令中使用-p xxxx:yyyy)或隐式绑定(在Dockerfile中使用EXPOSE并在命令行上使用-P),就像它说的那样here .如果您的Dockerfile不包含EXPOSE 8008,或者您未在docker run命令中指定–expose 8008,则即使您在docker run中使用-p 8008:8008,您的容器也无法与外界通信命令!

因此,要在容器上与tcp / 8008链接的主机上获取tcp / 8008,您需要在Dockerfile中使用EXPOSE 8008(然后使用docker构建容器)或者在docker run命令中显示8008.此外,您需要使用-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连接到您的容器.我总是忘记这一点并浪费半小时才记得我忘记了iptables -A INPUT …用于主机上的特定tcp端口.但是你应该能够在没有iptables规则的情况下从你的主机SSH到容器,因为它使用环回来进行本地连接.祝好运!

上一篇:IIS 服务器下载apk文件报404错


下一篇:javascript – 无法加载资源:服务器响应状态为403(禁止)MVC 5