目標:ローカルでリモートreplに接続します(例:lein repl :connect
経由)。
ローカルでは、これは簡単です:
lein repl :connect 8081
を実行して、出来上がり!接続された複製また、SSHトンネルを使用して、開いていないポートでreplが実行されているときに、リモートサーバーのreplに接続するためにこれを実行しました。
ssh -N -T -L 8081:localhost:8081 [email protected]
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を有効にしてみましたが、何も変わりませんでした。
質問:
ありがとう!
そして...トンネルには何の問題もないことがわかりました。
問題は、Dockerコンテナー内で組み込みのnreplサーバーを起動するには、「0.0.0.0」への明示的なバインディングが必要であることです。これがない場合、nreplサーバーはデフォルトで「localhost」にバインドします。これにより、ポートマッピングに関係なく、Dockerポートマッピングが0.0.0.0:を使用するため、Dockerコンテナーの外部からアクセスできなくなります。 nreplサーバーが正しくバインドされると、ポートマッピングが残りを処理します。
- Docker SSH を参照するのに役立つリンクと同じです。 DockerのSSHを管理する非常に簡略化された方法。