我的主机上有一个守护进程在某个端口上运行(即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到容器,因为它使用环回来进行本地连接.祝好运!