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

2024-03-23

我的主机上有一个守护进程在某个端口(即 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(使用前将#替换为@)

如何将容器上的 localhost 端口转发到主机上的 localhost? 的相关文章

随机推荐