如何将容器上的 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

原文由 Setheron 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 453
1 个回答

因此,您需要考虑的方式是 Docker 容器有自己的网络堆栈(除非您明确告诉它与 --net=host 共享主机的堆栈)。这意味着当与主机端口链接时,端口需要在 docker 容器 内部 和外部( 文档)公开。容器上暴露的端口需要显式绑定到主机端口(使用 -p xxxx:yyyy 在您的 docker run 命令)或隐式(使用 EXPOSE 和—在命令行上使用 -P ),就像 这里 所说的那样。如果您的 Dockerfile 不包含 EXPOSE 8008 ,或者您没有在 docker run 命令中指定 --expose 8008那么即使 您的容器无法与外界通信, 然后在 docker run 命令中使用 -p 8008:8008

- 因此,要在与容器上的 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 。另外,不要忘记您将无法从 Internet 上的另一台计算机通过 SSH 连接到您的容器,除非您 在主机上的 iptables 中也未阻止此端口。我总是最终忘记了这一点,浪费了半个小时才想起我忘记了 iptables -A INPUT ... 用于主机上的特定 tcp 端口。但是您应该能够在没有 iptables 规则的情况下从主机通过 SSH 连接到容器,因为它使用环回进行本地连接。祝你好运!

原文由 L0j1k 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题