web-dev-qa-db-ja.com

外部マシンから公開されたDockerコンテナポートにアクセスできません。ローカルホストからのみアクセスできますか?

ポートを公開する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コンテナではありません。

どうすれば修正できますか?

11
Robert Oschler

このフラグを使用してポートを公開していません:

-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の値を設定していない限り、最初の形式と同じです。

9
BMitch

コンテナのIPは192.5.169.50とは思いません。 docker inspect <container-uid> | grep IPAddressコンテナのIPを確認します。 172.17.0.Xのようなものになるはずです。

また、単にdocker run -d --network=Host <image>ホストネットワークの上にコンテナをスタックします。

コンテナはホストの上にあるものであり、ホストは実際に外部と通信しているものです。

2
Bill Cheng