ポートを公開するUbuntu Linux 14.04マシンで実行されているDockerコンテナーがあります。
docker run --name spacyapi -d -p 127.0.0.1:7091:7091 jgontrum/spacyapi:en
ローカルマシンから問題なくコンテナ内のサーバーにコマンドを接続して実行できます。例えば:
curl http://localhost:7091/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
コマンドは忠実に実行されます。ただし、外部マシンから同じCURLコマンドを試行すると、「接続拒否」エラーが表示されます。
curl http://192.5.169.50:5000/api --header 'content-type: application/json' --data '{"text": "This is a test."}' -X POST
curl: (7) Failed to connect to 192.5.169.50 port 7091: Connection refused
ここで、192.5.169.50は、Dockerコンテナを実行しているボックスのIPアドレスです。
同じボックスで実行されているNode.JSサーバーに設定する必要がないため、iptablesルールは必要ないと思います。ローカルネットワーク上の他のすべてのコンピューターは、Node.JSサーバーに問題なくアクセスできます。ただし、サーバーとして機能するDockerコンテナではありません。
どうすれば修正できますか?
このフラグを使用してポートを公開していません:
-p 127.0.0.1:7091:7091
そのフラグは、ホスト127.0.0.1インターフェース(localhost)、ポート7091からコンテナーポート7091に公開するように指示します。そのポートに到達する唯一の方法は、ホスト上にあり、ループバックインターフェースに接続することです。
ポートを公開するには、そのフラグからIPを削除します。
-p 7091:7091
または、次を使用してすべてのインターフェイスに明示的に公開します。
-p 0.0.0.0:7091:7091
後者の形式は、dockerd --ip x.x.x.x
でdockerデーモンの設定をオーバーライドしていない限り、または/etc/docker/daemon.jsonファイルでip
の値を設定していない限り、最初の形式と同じです。
コンテナのIPは192.5.169.50とは思いません。 docker inspect <container-uid> | grep IPAddress
コンテナのIPを確認します。 172.17.0.Xのようなものになるはずです。
また、単にdocker run -d --network=Host <image>
ホストネットワークの上にコンテナをスタックします。
コンテナはホストの上にあるものであり、ホストは実際に外部と通信しているものです。