Туннель SSH в контейнер Docker
Цель: локально подключиться к удаленному реплею (например, через lein repl :connect
).
На местном уровне это легко:
- Запустить сервер (он запускает встроенный сервер nrepl на порт 8081)
- Бежать
lein repl :connect 8081
& вуаля! Repl подключен
Я также сделал это, чтобы подключиться к repl на удаленном сервере, когда repl работал на порте, который не был открыт, используя туннель SSH:
- На some.host запустите сервер (он запускает встроенный сервер nrepl на порт 8081)
- SSH туннель
ssh -N -T -L 8081:localhost:8081 me@some.host
- Локально,
lein repl :connect 8081
& вуаля! Repl подключен
Тем не менее, моя текущая настройка заключается в том, что "сервер" запускается в контейнере 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
Примечательно, что ошибка в том, что соединение потеряно, потому что при запуске без открытого туннеля SSH та же команда завершается неудачно с Connection refused
, Это заставляет меня думать, что туннель SSH в порядке, и что проблема заключается в пересылке сервера в докер-контейнер, поэтому заголовок этого вопроса является общим вопросом об открытии туннеля из client -> server -> docker container
,
Я подумал, что это может быть связано с SSH GatewayPorts, поэтому я попытался включить GatewayPorts, но это ничего не изменило.
Вопросы:
- Есть ли что-то явно не так с подходом туннеля SSH выше?
- Как я могу определить, где разрывается соединение?
- Любые другие предложения?
Спасибо!
2 ответа
И... оказывается, с туннелем все было в порядке.
Проблема заключалась в том, что для запуска встроенного сервера nrepl внутри контейнера докера требуется явная привязка к "0.0.0.0". Без этого сервер nrepl по умолчанию привязывается к "localhost", что делает его недоступным извне контейнера Docker, несмотря на сопоставление портов, поскольку сопоставление портов Docker использует 0.0.0.0:. Как только сервер nrepl был правильно привязан, все остальное позаботилось о сопоставлении портов.
Просто в качестве полезной ссылки, чтобы взглянуть на - Docker SSH. Очень упрощенный способ управления SSH для Docker.