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

Jar*_*rdy 12 unix ssh networking containers docker

我在远程 VPS 上的 docker-compose 网络中运行容器。我希望能够从我的本地主机访问在这些容器之一中运行的数据库。

例如,如果容器appdb位于 VPS 上的容器网络中,我想db:5432我的机器的 localhost:5432. Kubernetes 的 CLI 允许使用kubectl port-forward <service-name> 5432:5432.

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

干杯。


编辑:我已经接受了 Ali Tou 的回答,但是,很高兴看到一个不需要重新启动容器来重新配置其端口以将它们暴露到主机上的解决方案。

编辑2:我在与切线相关的帖子/sf/answers/2945010421/中找到了一种使用socat在Docker网络中转发流量的巧妙方法。然而,这是公开暴露端口而不是创建隧道,例如在 SSH 解决方案中。

Ali*_*Tou 12

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

  1. 将容器端口公开到您的 VPS 端口,并绑定到其环回 IP 以确保安全:
ports:
  - 127.0.0.1:5432:5432
Run Code Online (Sandbox Code Playgroud)
  1. 使用 SSH 端口转发访问该容器的端口 5432:
ssh -f -N -L 127.0.0.1:5432:127.0.0.1:5432 <VPS_IP>
Run Code Online (Sandbox Code Playgroud)

上面的命令可能看起来令人困惑,但它请求 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:5432PS 但是,如果您没有安全问题,这与直接连接的情况没有什么不同。