docker容器中的SSH隧道

docker容器中的SSH隧道,docker,docker-compose,dockerfile,mqtt,Docker,Docker Compose,Dockerfile,Mqtt,我有一个运行在docker容器中的客户机,该容器订阅MQTT代理,然后将数据写入数据库。 要连接到MQTT代理,我必须设置端口转发 在我的本地计算机上开发客户端时,以下各项工作正常: SSH -L <mqtt-port:1883>:localhost:<9000> <user>@<ip-of-server-running-broker> SSH-L:localhost:@ 然后将客户机配置为通过localhost:9000订阅MQTT代理。 这

我有一个运行在docker容器中的客户机,该容器订阅MQTT代理,然后将数据写入数据库。 要连接到MQTT代理,我必须设置端口转发

在我的本地计算机上开发客户端时,以下各项工作正常:

SSH -L <mqtt-port:1883>:localhost:<9000> <user>@<ip-of-server-running-broker>
SSH-L:localhost:@
然后将客户机配置为通过localhost:9000订阅MQTT代理。 这一切都在我的本地机器上运行良好

在容器中它不会运行,除非我使用
--net=host
运行容器,但出于安全考虑,我不希望这样做

我尝试了以下方法:

  • 创建docker网络“testNetwork”
  • 在“testNetwork”内运行ssh_隧道容器,并在此容器内实现端口转发
  • 在“testNetwork”中运行数据库_客户机容器,并通过网桥网络订阅mqtt代理,如(“ssh_tunnel.testNetwork:”)
  • (我需要两个单独的容器,因为ip地址必须经常更改,我不想一直重新构建客户机容器)

    但到目前为止,我所有的尝试都失败了。转发似乎有效(我可以在ssh容器中访问服务器上的shell),但我还没有找到从客户机容器中实际订阅mqtt代理的方法

    也许这其实很简单,我只是不知道它是如何工作的,但我已经在这个问题上坚持了好几个小时了。。。
    任何帮助或提示都将不胜感激

    该解决方案实际上非常简单,不需要使用
    -net=host
    。 我需要绑定到
    0.0.0.0
    ,并使用网关转发选项允许远程主机(数据库客户端)连接到转发的端口

    ssh-L-g*::localhost:@


    同一Docker网桥网络中的其他容器可以简单地使用连接字符串

    我会将运行Docker容器的客户端配置为使用host
    host.Docker.internal
    。不确定是否等于使用
    --net=host
    …您是如何验证步骤2是否正确执行的?非常感谢您发布它,终于可以让它工作了!尽管修正很小,
    -g
    不应该在
    -L
    和转发之间options@dain很高兴我的解决方案对你有用!不过,我并不认为有必要进行更正,该命令完全按照我的预期工作。你能详细说明一下吗?如果我这样离开订单,我得到了
    错误的本地转发规范'-g'
    ,这很有意义,因为
    -g
    插入了
    -L
    及其参数之间。这订单对我有效。。您使用的是什么操作系统?
    OpenSSH_7.9p1 Debian-10+deb10u2、OpenSSL 1.1.1d 2019年9月10日
    Debian GNU/Linux 10(buster)