将远程 Docker 容器的端口转发到本地主机



我有在docker中运行的容器在远程VPS上组成网络。我希望能够从本地主机访问在其中一个容器中运行的数据库。

例如,如果容器appdb在VPS上的容器网络中,我想从我的机器的localhost:5432访问db:5432。Kubernetes的CLI允许kubectl port-forward <service-name> 5432:5432实现这一点。

在现有的unix命令和Docker的API中,是否有任何现有的解决方案可以实现这种效果?我在互联网上的搜索并没有产生任何CLI来实现这一点。

干杯。


编辑:我已经接受了Ali Tou的回答,但是,如果能看到一个不需要重新启动容器来重新配置其端口以将其暴露在主机上的解决方案,那就太好了。

编辑2:我在一篇相关文章中发现了一种使用socat在Docker网络中转发流量的聪明方法https://stackoverflow.com/a/42071577/12406113.但是,这是公开端口,而不是创建隧道,例如在SSH解决方案中。

假设您可以通过SSH访问运行容器的目标机器,则可以通过两个步骤实现:

  1. 将容器端口暴露到VPS端口,绑定到其环回IP以确保安全:
ports:
- 127.0.0.1:5432:5432
  1. 使用SSH端口转发访问该容器的端口5432:
ssh -f -N -L 127.0.0.1:5432:127.0.0.1:5432 <VPS_IP>

上面的命令可能看起来很混乱,但它请求SSH侦听客户端系统上的127.0.0.1:5432(第一个ip:port对(,并通过SSH隧道将其连接端口转发到远程系统的127.0.0.1:5432(第二个ip:pport对((用<VPS_IP>演示(。有关详细信息,请参阅此答案。

请注意,在网络保持连接之前,这种ssh连接是持久的。如果你想关闭这个连接,做一个ps aux | grep ssh来找到ssh转发过程的PID,然后用sudo kill -9 $PID来杀死它

附言:但是,如果没有安全问题,这与直接连接到VPS_IP:5432的情况没有什么不同。

您可以使用ports部分,在该部分您可以指定主机端口和容器端口来转发请求https://docs.docker.com/compose/networking/

最新更新