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
コンテナ内からこのサービスにアクセスするにはどうすればよいですかサービスを外部に公開せずに?
Docker for Linuxには現在、ホストのIPを取得するクリーンな方法がないため...
ホストのIPアドレスを取得するクリーンな方法は、コンテナー内に表示されるデフォルトゲートウェイのアドレスを使用することです。これは、コンテナーが接続されているホスト上のブリッジインターフェースのアドレスです。すべてのインターフェースでリッスンしているホスト上のすべてのサービスは、このアドレスでアクセスできます。
ただし、localhostにのみバインドされているサービスはそうではありません...
それは完全に予期されていることです。localhostアドレスをリッスンするサービスは、ローカルホストからのみアクセスできます。ローカルに接続されたネットワーク上の別のホストからアクセスすることはできません(これは、ネットワークの観点からはコンテナーと同じです)。
コンテナーからホストサービスにアクセスできるようにするには、次のいずれかを行う必要があります。
0.0.0.0
)、私は最終的にIPテーブルを使用してこの問題を解決しました。
私はここに私のソリューションをstackoverflowに追加しました: