2017-05-26 6 views
1

ドッカー実行を拒否私はドッカーイメージを構築し、私のPythonスクリプトは、Webリクエスト(外部API呼び出しを)作った後、ローカルホスト上で通信しているコンテナ内docker run -t imageName接続が

を実行した後、接続を拒否したそうですlogstashソケット。

私dockerfileは本当に簡単です:

FROM ubuntu:14.04 

RUN apt-get update -y 

RUN apt-get install -y nginx git python-setuptools python-dev 

RUN easy_install pip 

#Install app dependencies 
RUN pip install requests configparser 

EXPOSE 80 
EXPOSE 5000 

#Add project directory 
ADD . /usr/local/scripts/ 

#Set default working directory 
WORKDIR /usr/local/scripts 

CMD ["python", "logs.py"] 

しかし、私はこれを実行しようとすると、私は[ERROR] Connection refusedメッセージが表示されます。私がここで間違っていることを私にはすぐには分かりません - 私は80と5000を外界に開放していると信じていますか?これは間違っていますか?ありがとう。 EXPOSEについて

+2

ドッカーを使ってポートを公開するには、常に '-P srd:dst'フラグを使用する必要があります。 dockerイメージを-Lフラグで...使用するか、 'docker ps'を使って実際のポートを参照してください。 –

答えて

2

あなたが実行する各コンテナには、独自のネットワークインタフェースを持っています。 EXPOSE 5000を実行すると、dockerにと-Pを指定したときに、ドッカーに通知するかぎり、ホストマシンの任意のポート(docker psを参照)にコンテナネットワークインターフェイスのポート5000 をリンクするように指示します。

ログスタッシュについて。

Logstashがホストまたは別のコンテナにインストールされている場合は、logstashがコンテナの「localhost」にないことを意味します(各コンテナには独自のネットワークインターフェイスがあり、それぞれ独自のlocalhostを持っています) 。だから、適切にlogstashを指す必要があります。

どのようにですか?

方法1:

それはあなたのマシンと同じlocalhostを持っているので、コンテナに独自のiterfaceを与えないでください:

docker run --net=host ... 

を方法2:

docker-composeを使用している場合は、dockerネットワークのリンクを使用してください。 logstash:5000(ドッキングウィンドウがlogstashに対応する内部IPにその名前を解決します)


方法3:すなわち:このよう

services: 
    py_app: 
    ... 
    links: 
     - logstash 
    logstash: 
    image: .../logstash.. 

だから、ポイント

あなたに耳を傾けlogstash場合localhost:5000(あなたのホストから)、あなたのコンテナの中から172.17.0.1:5000のように指すことができます(172.17.0.1はです) 0固定IPですが、このオプションはそれほどエレガントではありません)、

+0

ありがとう!私は確かにlogstashの部分を修正することができます。興味深いのは、私のコードがまずPythonスクリプトでAPIリクエストを作成してJSONを取得し、それをソケット経由でログオンするようにポンピングすることです。 '接続が拒否されました 'は、このAPI呼び出しを行うためにインターネットに接続しようとするコンテナですか?私はそれがブロックされてlogstashに到達しようとしていると仮定していますが、API呼び出しが最初です。あなたの助けに感謝。 – HectorOfTroy407

+0

次にPythonの例外としてこのような接続拒否が表示され、エラーのコード行が表示されます。完全なエラーメッセージは何ですか? – Robert

+0

人形鍛造のdocker-platformモジュールを使用する場合、クラスdocker :: runの$ net引数はデフォルトで 'bridge'になっていることに注意してください。それを 'ホスト'(上記の方法1)に設定すると、https://docs.docker.com/registry/deploying/のチュートリアルに従った同様の問題が解決されました – Schuh