Meta: conectar-se localmente a uma replicação remota (por exemplo, via lein repl :connect
).
Localmente, isso é fácil:
- Executar servidor (inicia um servidor nrepl incorporado na porta 8081)
- Executar
lein repl :connect 8081
& voila! repl conectado
Também fiz isso para me conectar a uma replicação em um servidor remoto quando a replicação estava sendo executada em uma porta que não estava aberta, usando um túnel SSH:
- Em algum host, execute o servidor (ele inicia o servidor nrepl incorporado na porta 8081)
- túnel SSH
ssh -N -T -L 8081:localhost:8081 [email protected]
- Localmente,
lein repl :connect 8081
& voila! repl conectado
No entanto, minha configuração atual é que o "servidor" é executado em um contêiner do Docker, que mapeia a porta 8081. Portanto, para se conectar ao servidor nrepl, ele precisa ser local - > some.host - > contêiner-contêiner - > nrepl.
Posso ver que meu contêiner docker tem a porta 8081 mapeada:
$ sudo docker port container-id 8081
0.0.0.0:8081
E, no servidor que hospeda o contêiner docker, vejo que a porta 8081 está ouvindo:
$ netstat -anl | sed -n '2p;/8081/p'
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::8081 :::* LISTEN
E parece que eu posso abrir um túnel SSH para a porta 8081; por exemplo. sem erros / avisos da execução:
ssh -N -T -L *:8081:localhost:8081 [email protected]
O que me faz pensar que tenho o túnel SSH correto, exceto que sempre que tento conectar-me ao servidor de replicação em execução, ele falha imediatamente, assim:
$ 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
É notável que o erro é a conexão perdida, porque a execução sem o túnel SSH é aberto, o mesmo comando falha com Connection refused
. Isso me faz pensar que o túnel SSH está OK e que o problema está no encaminhamento do servidor para o contêiner docker, e é por isso que o título desta é uma questão genérica sobre abrir um túnel a partir de client -> server -> docker container
.
Eu pensei que poderia ser algo para fazer com o SSH GatewayPorts, então eu tentei ativar o GatewayPorts, mas isso não mudou nada.
Perguntas:
- Há algo obviamente errado com a abordagem do túnel SSH acima?
- Como posso determinar onde a conexão está sendo descartada?
- Alguma outra sugestão?
Obrigado!