web-dev-qa-db-ja.com

Dockerコンテナー内からのローカルホストサービスへのアクセス

Dockerコンテナー内からアクセスできるようにするローカルホストにバインドされたサービスがあります。関連するnetstat出力:(サービスはポート1143にあります)

$ netstat -tulpn
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nam
tcp        0      0 127.0.0.1:1143          0.0.0.0:*               LISTEN      23317/protonmail-br
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1527/sshd

Docker for linuxには現在ホストのIPを取得するクリーンな方法がないため、ブリッジネットワーク経由でホストを公開する qoomon/docker-Host 回避策の画像を使用しています。 dockerhostを使用してコンテナからホストにアクセスできます:

bash-5.0# ping dockerhost
PING dockerhost (172.22.0.2): 56 data bytes
64 bytes from 172.22.0.2: seq=0 ttl=64 time=0.187 ms
64 bytes from 172.22.0.2: seq=1 ttl=64 time=0.298 ms
64 bytes from 172.22.0.2: seq=2 ttl=64 time=0.126 ms

telnetを使用して、コンテナーがポートに接続できるかどうかを確認しています。

0.0.0.0にバインドされたサービスにアクセスできます:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

ただし、localhostにのみバインドされているサービスは次のとおりではありません。

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote Host (172.22.0.2): Connection refused

コンテナ内からこのサービスにアクセスするにはどうすればよいですかサービスを外部に公開せずに

2
JShorthouse

Docker for Linuxには現在、ホストのIPを取得するクリーンな方法がないため...

ホストのIPアドレスを取得するクリーンな方法は、コンテナー内に表示されるデフォルトゲートウェイのアドレスを使用することです。これは、コンテナーが接続されているホスト上のブリッジインターフェースのアドレスです。すべてのインターフェースでリッスンしているホスト上のすべてのサービスは、このアドレスでアクセスできます。

ただし、localhostにのみバインドされているサービスはそうではありません...

それは完全に予期されていることです。localhostアドレスをリッスンするサービスは、ローカルホストからのみアクセスできます。ローカルに接続されたネットワーク上の別のホストからアクセスすることはできません(これは、ネットワークの観点からはコンテナーと同じです)。

コンテナーからホストサービスにアクセスできるようにするには、次のいずれかを行う必要があります。

  • すべてのアドレス(0.0.0.0)、
  • サービスに適切なDockerブリッジアドレスを明示的にリッスンさせる、または
  • サービスに他のアドレスをリッスンさせ、そのアドレスを環境変数として、または他の構成メカニズムを介してコンテナに渡します。
2
larsks

私は最終的にIPテーブルを使用してこの問題を解決しました。

私はここに私のソリューションをstackoverflowに追加しました:

https://stackoverflow.com/a/57833573/10735374

0
JShorthouse