我的主机上有一个守护进程在某个端口(即 8008)上运行,并且我的代码通常通过联系 localhost:8008 与守护进程交互。
我现在已经容器化了我的代码,但还没有容器化守护进程。
如何将容器上的 localhost:8008 转发到运行容器的主机(以及守护进程)上的 localhost:8008。
以下是netstat -tlnp
on my host。我想要容器将 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
)。这意味着端口需要暴露insidedocker 容器以及外部(文档 https://docs.docker.com/reference/run/#expose-incoming-ports),当与主机端口链接时。容器上暴露的端口需要显式绑定到主机端口(使用-p xxxx:yyyy
在你的docker run
命令)或隐式(使用EXPOSE
在你的 Dockerfile 中并使用-P
在命令行上),就像它说的那样here https://docs.docker.com/articles/networking/#binding-ports。如果您的 Dockerfile 不包含EXPOSE 8008
,或者您没有指定--expose 8008
在你的docker run
命令,你的容器无法与外界对话,即使你然后使用-p 8008:8008
在你的docker run
命令!
因此,要获得与容器上的 tcp/8008 链接的主机上的 tcp/8008,您需要EXPOSE 8008
在你的 Dockerfile 中(然后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
。另外,不要忘记,您将无法从互联网上的另一台计算机通过 SSH 访问您的容器,除非您也在 iptables 中解锁了此端口在主机上。我总是最终忘记了这一点并且浪费了半个小时才想起我忘记了iptables -A INPUT ...
对于主机上的特定 tcp 端口。但是您应该能够在没有 iptables 规则的情况下从主机通过 SSH 访问容器,因为它使用环回进行本地连接。祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)