我的主机上有一个守护程序在某个端口(即 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 许可协议
因此,您需要考虑的方式是 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 连接到容器,因为它使用环回进行本地连接。祝你好运!