web-dev-qa-db-ja.com

DockerコンテナーへのSSHトンネル

目標:ローカルでリモートreplに接続します(例:lein repl :connect経由)。

ローカルでは、これは簡単です:

  1. サーバーを実行します(ポート8081で組み込みnreplサーバーを起動します)
  2. lein repl :connect 8081を実行して、出来上がり!接続された複製

また、SSHトンネルを使用して、開いていないポートでreplが実行されているときに、リモートサーバーのreplに接続するためにこれを実行しました。

  1. Some.Hostでサーバーを実行します(ポート8081で組み込みnreplサーバーを起動します)
  2. SSHトンネルssh -N -T -L 8081:localhost:8081 [email protected]
  3. ローカルでは、lein repl :connect 8081と出来上がり!接続された複製

ただし、私の現在の設定では、「サーバー」はポート8081をマップするDockerコンテナーで実行されます。したがって、nreplサーバーに接続するには、ローカル-> some.Host-> docker-container-> nreplに移動する必要があります。 。

私のdockerコンテナーにポート8081がマップされていることがわかります:

$ Sudo docker port container-id 8081
0.0.0.0:8081

そして、Dockerコンテナーをホストしているサーバーで、ポート8081がリッスンしていることがわかります。

$ netstat -anl | sed -n '2p;/8081/p'
Proto    Recv-Q    Send-Q    Local Address   Foreign Address     State  
tcp      0         0         :::8081         :::*                LISTEN

そしてseemsポート8081のSSHトンネルを開くことができるように;例えば実行によるエラー/警告なし:

ssh -N -T -L *:8081:localhost:8081 [email protected]

これにより、実行中のreplサーバーに接続しようとするたびに次のようにすぐに失敗することを除いて、正しいSSHトンネルがあると思います。

$ 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

エラーは接続が失われたことであることに注目してください。without SSHトンネルが開いているため、同じコマンドがConnection refusedで失敗します。そのため、SSHトンネルは問題なく、サーバーのdockerコンテナーへの転送に問題があると思います。そのため、このタイトルはclient -> server -> docker containerからのトンネルのオープンに関する一般的な質問です。

SSH GatewayPortsと関係があるのではないかと思ったので、GatewayPortsを有効にしてみましたが、何も変わりませんでした。

質問:

  1. 上記のSSHトンネルアプローチに明らかに問題はありますか?
  2. どのようにしてwhere接続が切断されているかを判断できますか?
  3. 他に何か提案はありますか?

ありがとう!

4
Ryan Wilson

そして...トンネルには何の問題もないことがわかりました。

問題は、Dockerコンテナー内で組み込みのnreplサーバーを起動するには、「0.0.0.0」への明示的なバインディングが必要であることです。これがない場合、nreplサーバーはデフォルトで「localhost」にバインドします。これにより、ポートマッピングに関係なく、Dockerポートマッピングが0.0.0.0:を使用するため、Dockerコンテナーの外部からアクセスできなくなります。 nreplサーバーが正しくバインドされると、ポートマッピングが残りを処理します。

3
Ryan Wilson

- Docker SSH を参照するのに役立つリンクと同じです。 DockerのSSHを管理する非常に簡略化された方法。

2
Harry Traynor