Цель: подключиться локально к удаленному ответу (например, через lein repl :connect
).
Локально это просто:
lein repl :connect 8081
и вуаля! ответ подключенЯ также сделал это, чтобы подключиться к репу на удаленном сервере, когда репл работал на закрытом порту, с помощью туннеля SSH:
ssh -N -T -L 8081:localhost:8081 me@some.host
lein repl :connect 8081
и вуаля! ответ подключенОднако моя текущая настройка такова, что «сервер» запускается в контейнере Docker, который отображает порт 8081. Итак, чтобы подключиться к серверу nrepl, он должен быть локальным -> some.host -> docker-container -> nrepl .
Я вижу, что моему контейнеру докеров сопоставлен порт 8081:
$ sudo docker port container-id 8081
0.0.0.0:8081
И на сервере, на котором размещен контейнер докеров, я вижу, что порт 8081 прослушивает:
$ netstat -anl | sed -n '2p;/8081/p'
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::8081 :::* LISTEN
И это кажется как я могу открыть туннель SSH для порта 8081; например нет ошибок / предупреждений при запуске:
ssh -N -T -L *:8081:localhost:8081 me@some.host
Это заставляет меня думать, что у меня правильный туннель 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
Примечательно, что ошибка в том, что соединение потеряно, потому что run без туннель SSH открыт, та же команда не работает с Connection refused
. Это заставляет меня думать, что туннель SSH в порядке, и что проблема заключается в перенаправлении сервера в контейнер докеров, поэтому заголовок этого является общим вопросом об открытии туннеля из client -> server -> docker container
.
Я подумал, что это может быть связано с SSH GatewayPorts, поэтому я попытался включить GatewayPorts, но это ничего не изменило.
Вопросы:
Спасибо!
И ... оказывается, с туннелем все было в порядке.
Проблема заключалась в том, что для запуска встроенного сервера nrepl внутри контейнера докеров требуется явная привязка к «0.0.0.0». Без этого сервер nrepl по умолчанию привязывается к «localhost», что делает его недоступным извне контейнера докеров, несмотря на сопоставление портов, поскольку сопоставление портов докеров использует 0.0.0.0 :. После того, как сервер nrepl был правильно привязан, все остальное позаботилось о сопоставлении портов.
Просто как полезная ссылка, на которую можно взглянуть - Докер SSH. Очень упрощенный способ управления SSH для Docker.