我有一个基本的分布式系统,可以计算Github仓库所有提交的平均圈复杂度。它由在Flask上运行的主节点组成,当它们向主服务器发送GET请求时,它为一组工作节点提供SHA ID。
我试图使用Docker进行一些练习,并希望将我的Worker代码放在Docker容器中,然后将该容器放在一组远程计算机上并让Master在我的本地计算机上运行。我希望工人和师父能够彼此沟通。
我不清楚如何去做这件事。我已经尝试告诉Worker节点将他们的请求发送到我的本地机器公共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()
工人网址:
master_url = 'http://<my public ip>:5000/'
node_setup_url = 'http://<my public ip>:5000/init'
-------------------------------------编辑--------- ------------------------
正如@odk和@jonasheinisch所说,这实际上是一个网络错误。我正在我的大学网络上的远程计算机上部署我的docker容器。我创建了两个AWS实例,一个用于Master,另一个用于Worker,并且它已经工作了。
我现在更新了设置,并会根据要求提供更多上下文。我仍然不确定的一件事是我的工人的要求是如何向我的主人提出的。我已将主机上的端口80映射到Docker容器上的端口80,如下面的Dockerfile所示。我选择端口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'
Master仍然在侦听端口5000上的所有接口。我的请求(从Python请求库发送)到底在Docker容器之外到达Internet是什么样的?
答案 0 :(得分:1)
关于主要问题:您确认这是网络连接问题。案件结案。
关于您的编辑:由于工作人员是启动连接的工作人员(至少从您的描述中),您不需要公开这些容器上的任何端口。 Docker使用iptables为容器出口流量设置NAT(您可以使用iptables -L
以root身份在Linux主机上验证这一点。它与您的家庭网络中的相同,您可能有一些小型路由器为您的家庭做NAT。如果您想访问互联网上的任何网站,您也不需要打开任何端口。只有当容器中的某些内容实际侦听并且应该接收入口流量时,才需要公开端口。希望现在更清楚了。
答案 1 :(得分:0)
是。 您可以创建包含本地计算机和远程计算机的docker swarm,然后将您的worker和master作为服务部署在同一个docker网络中。见https://docs.docker.com/engine/swarm。
要定位群组中的特定计算机,您需要标记它们并将标签用作展示位置约束(请参阅https://docs.docker.com/engine/swarm/services/#placement-constraints)。
答案 2 :(得分:0)
尝试使用您的服务名称代替您的IP,这应该会有所帮助。