目标:本地连接到远程repl(例如,通过lein repl :connect )。
本地,这很简单:
lein repl :connect 8081 &瞧! repl连接 我还通过使用SSH隧道,在repl在未打开的端口上运行时连接到远程服务器上的repl:
ssh -N -T -L 8081:localhost:8081 [email protected] lein repl :connect 8081 &瞧! repl连接 然而,我目前的设置是“服务器”运行在一个Docker容器,它映射端口8081.所以,为了连接到nrepl服务器,它必须去本地 – > some.host – >docker容器 – > nrepl 。
我可以看到我的docker容器映射了端口8081:
$ sudo docker port container-id 8081 0.0.0.0:8081
而且,在托pipeDocker容器的服务器上,我可以看到端口8081正在侦听:
$ netstat -anl | sed -n '2p;/8081/p' Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 :::8081 :::* LISTEN
而且好像我可以打开8081端口的SSH隧道。 例如没有运行的错误/警告:
ssh -N -T -L *:8081:localhost:8081 [email protected]
这使得我认为我拥有正确的SSH隧道,除非每当我尝试连接到正在运行的repl服务器时,它立即失败,如下所示:
$ lein repl :connect 8081 Connecting to nREPL at 127.0.0.1:8081 SocketException The transport's socket appears to have lost its connection to the nREPL server
值得注意的是,错误是连接丢失,因为没有打开SSH隧道运行,相同的命令失败, Connection refused 。 这使得我认为SSH隧道是确定的,问题是在服务器转发到docker容器,这就是为什么这是一个关于从client -> server -> docker container打开隧道的通用问题。
我认为这可能是与SSH GatewayPorts有关,所以我试图启用GatewayPorts,但没有改变任何东西。
问题:
谢谢!
而且……事实certificate隧道没有什么问题。
问题是,在Docker容器中启动embedded式nrepl服务器需要显式绑定到“0.0.0.0”。 如果没有这样做,缺省情况下,nrepl服务器会绑定到“localhost”,这使得无法通过端口映射从docker容器外部访问,因为docker端口映射使用了0.0.0.0 :. 一旦nrepl服务器绑定正确,端口映射照顾其余。
作为一个有用的链接来看看 – Docker SSH 。 为Dockerpipe理SSH的非常简单的方法。