macos - 在 macos Mojave 10.14 上从 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 容器内部到数据库的连接不起作用。
解决方案
172.18.0.1
是 docker默认网桥网关的 IP,而不是你主机的 IP。
您可以运行此命令进行检查。
$ docker network inspect bridge
Docker for Mac 有限制
- macOS 上没有 docker0 网桥(它位于 Mac 和 Windows 上的 docker VM 主机中)
- 你不能 ping 容器(不刮一堆牦牛)
- 无法按容器 IP 寻址
另请注意,这意味着--net-host
Mac 不支持 docker run 选项,但也许这是件好事
有一个解决方法
- 这些魔术地址从容器内解析为主机的 IP
- docker.for.mac.localhost(已弃用)
- docker.for.mac.host.internal(已弃用)
- 主机.docker.internal
- 这解析到主机mac的网关
- 网关.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]
推荐阅读
- javascript - 当 chrome 选项卡处于非活动状态运行画布时,内存堆增加
- python - python占用的内存在通过服务运行时不断积累而不释放到操作系统(龙卷风)
- ruby - 参数数量错误(给定 0,预期为 1)(ArgumentError) - Ruby MongoDb
- javascript - 如何从Vue中的每个对象数组中获取总数
- javascript - 方法在 iis 和 iis express 中执行不同
- python - 如何使用 Python 在随机森林中投票?
- matlab - 从用 Visual Studio 2015 编写的 Fortran 程序调用 Matlab 引擎时出错
- oauth-2.0 - 单页应用程序-Oauth-2:我们需要刷新令牌吗?
- rx-java2 - RxJava2:调用 Flowable.toList 时处理空值
- java - 折线不会出现