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

10
我有一些容器在远程VPS上的docker-compose网络中运行。我想要能够从我的本地主机访问其中一个容器中运行的数据库。例如,如果容器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://dev59.com/gGIj5IYBdhLWcg3wx30x#42071577。然而,这是公开暴露端口而不是创建隧道,例如SSH解决方案。


转发到本地主机的目的是什么? - Ali Tou
@AliTou - 在我的情况下,与合作伙伴在同一个数据库上进行开发工作是非常有用的。这也可以用于使用您喜欢的客户端调试数据库以及进行一般故障排除。 - Jarred Vardy
你有目标机器的ssh访问权限吗? - Ali Tou
你需要将本地端口映射到VPS的端口上,我认为下面的教程也许会有所帮助。另外,正如@AliTou所指出的那样,你也可以使用SSH进行端口映射。https://devops.ionos.com/tutorials/configure-apache-as-a-reverse-proxy-using-mod_proxy-on-ubuntu/ - badger
2
这不是一个编程问题,可能更适合于superuser.com。 - Ulrich Eckhardt
2个回答

12
假设您可以通过SSH访问容器运行的目标机器,您可以通过以下两个步骤实现:
  1. 将容器端口暴露到VPS端口,并绑定到其环回IP以提高安全性:
ports:
  - 127.0.0.1:5432:5432

使用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:端口对),并通过ssh隧道将其连接转发到远程系统的127.0.0.1:5432(第二个ip:端口对),这可以用<VPS_IP>演示。有关更多信息,请参见此答案
请注意,此ssh连接保持持久性,直到您的网络保持连接。如果您想关闭此连接,请执行ps aux | grep ssh以查找ssh转发进程的PID,然后使用sudo kill -9 $PID来终止它。
附言:如果您没有安全顾虑,则与直接连接VPS_IP:5432的情况没有区别。

这正是我在寻找的解决方案,谢谢!我不知道你可以在内部绑定端口的IP。出于安全原因,我认为这将会更加复杂。非常优美。 - Jarred Vardy
非常不错!那服务怎么样?我无法将服务绑定到127.0.0.1,我收到了这个错误消息:“--publish-add”标志的无效参数“127.0.0.1:15672:15672”:不支持主机IP。 - Ebrahim Karimi
@EbrahimKarimi 你应该将其作为另一个问题发布或在他们的GitHub问题中寻找。我在这里找到了一个旧问题描述你的问题,但它没有得到答复:https://github.com/docker-archive/classicswarm/issues/2478 - Ali Tou

-1

也许我没有表达清楚,但这不是我要问的。如果您阅读示例,请注意我正在寻找从完全不同的机器访问容器端口,而不是容器网络主机。 - Jarred Vardy
您可以使用远程系统的主机名和发布的端口号来访问该服务。 - David Maze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接