Túnel SSH para o contêiner do Docker

4

Meta: conectar-se localmente a uma replicação remota (por exemplo, via lein repl :connect ).

Localmente, isso é fácil:

  1. Executar servidor (inicia um servidor nrepl incorporado na porta 8081)
  2. 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:

  1. Em algum host, execute o servidor (ele inicia o servidor nrepl incorporado na porta 8081)
  2. túnel SSH ssh -N -T -L 8081:localhost:8081 [email protected]
  3. 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:

  1. Há algo obviamente errado com a abordagem do túnel SSH acima?
  2. Como posso determinar onde a conexão está sendo descartada?
  3. Alguma outra sugestão?

Obrigado!

    
por Ryan Wilson 15.08.2015 / 02:24

2 respostas

3

E ... acontece que não havia nada errado com o túnel.

O problema é que iniciar um servidor nrepl embutido dentro de um contêiner docker requer uma vinculação explícita a "0.0.0.0". Sem isso, o servidor nrepl, por padrão, liga-se ao "localhost", o que o torna inacessível de fora do contêiner do docker, apesar do mapeamento de porta, porque o mapeamento da porta do docker usa 0.0.0.0 :. Uma vez que o servidor nrepl foi ligado corretamente, o mapeamento de porta cuidou do resto.

    
por 15.08.2015 / 03:41
2

Apenas como um link útil para dar uma olhada - SSH do Docker . Forma muito simplificada de gerenciar o SSH para o Docker.

    
por 18.04.2017 / 16:44