2017-11-29 9 views
0

Githubリポジトリのすべてのコミットにおける平均サイクロマティック複雑度を計算する基本的な分散システムを持っています。 Flask上で動作するマスターノードで構成され、マスタノードにGETリクエストを送信するときに、一連のワーカノードにSHA IDを提供します。実行中のDockerコンテナの内部からHTTPリクエストを送信することは可能ですか?

私はDockerでいくつかの練習をしようとしていましたが、Dockerコンテナにワーカーコードを入れて、そのコンテナをリモートマシンのセットに置き、ローカルマシンでMasterを実行させたいとしました。私は労働者とマスターがお互いにコミュニケーションできるようにしたいと思っていました。

私はこれを行う方法については明確ではありません。私はローカルマシンのパブリックIPとFlaskサーバーが稼働しているポート(5000)にリクエストを送信するようにワーカーノードに指示してみました。リモートマシンのポート5000をDockerコンテナのポート5000にマップしました。それは私がここで知っている程度です。私はプログラム全体をコピーしてコピーすることなく、関連するコードスニペットを以下に添付します。

マスターのセットアップ:

if __name__ == '__main__': 
    get_commits() 
    TOTAL_COMMITS = len(JOB_QUEUE) 
    app.run(host='0.0.0.0', port=5000, debug=False) 
    print('\n-----Shutting Down Server-----') 
    calc_avg_cc() 

ワーカーのURL:

master_url = 'http://<my public ip>:5000/' 
node_setup_url = 'http://<my public ip>:5000/init' 

-------------------------- -----------編集---------------------------------

As @odkと@jonasheinischは、実際にはネットワークエラーであることを示唆していました。私は私の大学のネットワークにあったリ​​モートマシンに私のドッカーコンテナを配備していました。私は2つのAWSインスタンスを作成しました.1つはマスター用、もう1つはWorker's用です。

私は今すぐセットアップを更新し、要求どおりにもう少しコンテキストを提供します。私がまだ分かっていないことの一つは、私の労働者からの私の要求が私のマスターにそれをいかにして行っているかです。 Dockerコンテナのポート80に、ホスト上のポート80をマップしました。下のDockerファイルに示されています。ポート80は、HTTPトラフィックに関連付けられていることがわかっているため、推測のビットとして選択しました。

Dockerfile:

# Use an official Python runtime as a parent image 
FROM python:3.5-slim 

# Set the working directory to /worker 
WORKDIR /worker 

# Copy the current directory contents into the container at /app 
ADD worker.py requirements.txt github-token ./ 

# Install any needed packages specified in requirements.txt 
RUN pip install -r requirements.txt 

# Make port 80 available to the world outside this container 
EXPOSE 80 

# Run app.py when the container launches 
CMD ["python", "worker.py"] 

新しいワーカーのセットアップ:

master_url = 'http://<public IP of my AWS Master Instance>:5000/' 
node_setup_url = 'http://<public IP of my AWS Master Instance>:5000/init' 

マスターは、まだどのように正確に(Pythonの要求ライブラリーから送信された)私の要求はそれを作るのですポート5000上のすべてのインターフェイスでリッスンしていますDockerコンテナの外にインターネットがありますか?

+1

短い答え:はい - もちろんです。 Dockerコンテナからデータを送信することは、まったく可能です。 特定の質問がある場合。何が動作していないか、何をやっているのか、物事がセットアップされているかなどの詳細情報で質問を更新してください。 –

+1

セットアップでは、それはそのままで動作するはずです。リモートマシンからローカルマシンのポート5000(ドッカーなし)に接続できますか?カールやwgetで簡単にテストできます。私にとっては、ネットワーク関連の問題のように見えます。 – odk

+0

@TJBiddle私はうまくいけば、もう少し文脈を提供するように編集しました –

答えて

0

重要な問題について:ネットワーク接続の問題であることが確認されました。ケースが閉まった。 編集について:ワーカーが(少なくともあなたの説明から)接続を開始するものであるため、それらのコンテナにポートを公開する必要はありません。 Dockerは、コンテナ出口トラフィック用にiptablesを使用してNATを設定します(これはLinuxホストではiptables -Lをrootとして確認できます)。あなたの家のネットワークと同じですが、あなたの家にはNATを行う小さなルータがあるでしょう。また、インターネット上の任意のサイトにアクセスしたい場合は、ポートを開く必要はありません。コンテナ内の何かが実際にリッスンし、入力トラフィックを受け取る必要がある場合にのみ、ポートを公開する必要があります。これがより明確になることを願っています。

+0

2番目の問題への回答は素晴らしかったです、ありがとう! –

0

はい。 ローカルマシンとリモートマシンを含むドッカーを作成し、同じドッカーネットワークにサービスとしてワーカーとマスターを展開することができます。 https://docs.docker.com/engine/swarmを参照してください。

swarmの特定のマシンをターゲットにするには、そのマシンにラベルを付け、そのラベルを配置制約として使用する必要があります(https://docs.docker.com/engine/swarm/services/#placement-constraintsを参照)。

+0

あなたのローカルマシンがリモートマシンからアクセス可能な場合、Docker swarmなしでも可能です。それはおそらくネットワークの問題です... – jonasheinisch

+1

実際には、2番目のパラグラフではリモートマシン上に複数のワーカーを配置していると言われていますが、それは理にかなっています。 – Philippe

関連する問題