【问题标题】:Setup ssh tunnel from docker container on macos Mojave 10.14在 macOS Mojave 10.14 上从 docker 容器设置 ssh 隧道
【发布时间】:2019-08-02 20:49:11
【问题描述】:

我在我的 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 容器内部到数据库的连接不起作用。

【问题讨论】:

    标签: macos docker ssh


    【解决方案1】:

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

    $ docker network inspect bridge
    

    Docker for Mac 有limitations

    • macOS 上没有 docker0 网桥(它位于 Mac 和 Windows 上的 docker VM 主机中)
    • 您无法 ping 容器(不刮一堆牦牛)
    • 无法按容器 IP 寻址

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

    有一个解决方法

    • 这些魔术地址从容器内解析为主机的 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]

    【讨论】:

      猜你喜欢
      • 2017-01-22
      • 2019-03-02
      • 2020-07-13
      • 1970-01-01
      • 2011-09-29
      相关资源
      最近更新 更多