Ubuntu tustyを使用すると、リモートマシンで実行されているサービスがあり、localhost:9999
からsshトンネルを介してポート転送を介してアクセスできます。
Dockerコンテナを実行しています。コンテナ内から、ホストのトンネル経由でそのリモートサービスにアクセスする必要があります。
-L 9000:Host-ip:9999
を使用してコンテナからホストへのトンネリングを試みましたが、コンテナ内から127.0.0.1:9000
を介してサービスにアクセスすると接続に失敗します。ポートマッピングがオンかどうかを確認するために、nc -luv -p 9999 # at Host nc -luv -p 9000 # at container
を試しました
次の this、parag。2 しかし、コンテナでnc -luv Host-ip -p 9000
を実行しているときでも、知覚される通信はありませんでした
また、docker run -p 9999:9000
経由でポートをマッピングしようとしましたが、ホストポートが既に使用されているため(おそらくホストトンネルからリモートマシンへ)バインドが失敗したことが報告されます。
だから私の質問は
1-接続をどのように達成しますか?ホストへのsshトンネルをセットアップする必要がありますか、またはこれはdockerポートマッピングのみで実現できますか?
2-接続が確立されていることをテストする簡単な方法は何ですか?できればbash経由。
ありがとう。
Docker実行に--net=Host
を追加することでそれができると思います。しかし、この質問も参照してください: ホストポートをdockerコンテナに転送
--net=Host
を介して、またはnetwork_mode: Host
を介してdocker-composeでコンテナのネットワークとしてホストネットワークを使用することは1つのオプションですが、これは(a)ホストシステムでコンテナポートを公開するという望ましくない副作用があります(b)ホストネットワークにマッピングされていないコンテナには接続できなくなります。
あなたの場合、迅速かつクリーンな解決策は、ホスト環境でドッカーコンテナを公開するのではなく(例えば、sshをdocker0
ブリッジにバインドすることにより)、sshトンネルをドッカーコンテナに「利用可能」にすることです(推奨)受け入れられた答えで)。
トンネルのセットアップ:
これが機能するには、docker0
ブリッジが使用しているIPを取得します。
ifconfig
次のようなものが表示されます。
docker0 Link encap:Ethernet HWaddr 03:41:4a:26:b7:31
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
ここで、sshに このip にバインドして、ポート9000に向けられたトラフィックをリッスンする必要があります。
ssh -L 172.17.0.1:9000:Host-ip:9999
bind_addressを設定しない場合、:9000
は only をホストのループバックインターフェイスで使用でき、それ自体はドッカーコンテナでは使用できません。
サイドノート:トンネルを0.0.0.0
にバインドすることもできます。これにより、sshはすべてのインターフェースをリッスンします。
アプリケーションのセットアップ:
コンテナ化されたアプリケーションで、同じdocker0
ipを使用してサーバーに接続します:172.17.0.1:9000
。これで、docker0
ブリッジを介してルーティングされるトラフィックもsshトンネルに到達します:)
たとえば、:9000
にあるリモートデータベースに接続する必要がある "DOT.NET Core"アプリケーションがある場合、 "ConnectionString"には"server=172.17.0.1,9000;
が含まれます。