从macos Mojave 10.14上的docker容器设置ssh隧道

时间:2018-12-13 16:34:01

标签: macos docker ssh

我在Mac机器上设置ssh隧道时遇到问题。我在Ubuntu盒子上设置隧道没有问题。这是我运行的命令

ssh -nNT -L 172.18.0.1:4000:production-database-url:3306 jump-point

在Mac上运行此命令时,出现以下错误:

bind [172.18.0.1]:4000: Can't assign requested address
channel_setup_fwd_listener_tcpip: cannot listen to port: 4000 Could
not request local forwarding.

如果我在没有bind_address(172.18.0.1)的情况下运行,则可以通过隧道连接到数据库。

如果我绑定到所有接口(0.0.0.0),则打开了隧道,但是,从Docker容器内部到数据库的连接不起作用。

1 个答案:

答案 0 :(得分:1)

172.18.0.1是docker的default bridge network gateway的IP,而不是主机的IP。
您可以运行此命令进行检查。

$ docker network inspect bridge
  

适用于Mac的Docker具有limitations

  • macOS上没有docker0桥(在Mac和Windows上的docker VM主机中)
  • 您不能ping容器(不剃a牛)
  • 无法按容器进行IP寻址

还请注意,这意味着docker run选项--net-host在Mac上不受支持,但这也许是一件好事

  

有一种解决方法

  • 这些魔术地址从容器中解析为主机的IP
    • docker.for.mac.localhost(不建议使用)
    • docker.for.mac.host.internal(已弃用)
    • host.docker.internal
  • 此解析为主机mac的网关
    • gateway.docker.internal

在容器内使用名称host.docker.internal,就像直接在Mac上使用localhost一样。

不用担心隧道的绑定地址:

ssh -nNT -L 4000:production-database-url:3306 jump-point

您没有提到哪个数据库,但是我从3306端口获取它是MySQL。

要使用mysql cli从容器内通过主机上的ssh隧道连接到远程mysql数据库服务器,可以运行:

mysql --host host.docker.internal [... other options go here]