是否有可能从正在运行的Docker容器中发送HTTP请求

我有一个基本的分布式系统,可以计算Github所有提交回购的平均回圈复杂度。 它由一个在Flask上运行的主节点组成,这个主节点在发送一个GET请求给主节点时给一组Worker节点提供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() 

工人URLS:

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

– – – – – – – – – – – – – – – – – – -编辑 – – – – – – ———————

正如@odk和@jonasheinischbuild议的,这实际上是一个networking错误。 我正在我的大学networking上的远程机器上部署我的docker容器。 我创build了两个AWS实例,一个用于Master,另一个用于Worker,并且嗨,它工作。

我已经更新了安装程序,并会根据要求提供更多的上下文。 有一件我还不确定的事情就是我的工作人员向我的主人提出的要求。 我已经将主机上的端口80映射到Docker容器上的端口80,如下面的Dockerfile所示。 我select了端口80作为一个猜测,因为我知道它与HTTPstream量有关。

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上?

关于主要问题:如您确认这是一个networking连接问题。 案件结案。 关于你的编辑:由于工作人员是启动连接的人(至less从你的描述),你不需要暴露这些容器上的任何端口。 Docker使用iptables为容器出口stream量设置NAT(可以使用iptables -L作为root用户在Linux主机上进行validation)。 和你的家庭networking一样,你可能有一些小的路由器为你的家庭做NAT。 如果你想访问互联网上的任何网站,你不需要打开任何端口。 只有当容器中的某些内容实际监听时才需要公开端口,并且应该接收入站stream量。 希望现在更清楚。

是。 你可以build立一个包含你的本地机器和远程机器的docker群,然后在同一个dockernetworking中部署你的工人和主服务器。 请参阅https://docs.docker.com/engine/swarm

要定位群体上的特定机器,您需要标记这些机器并将其作为放置约束(请参阅https://docs.docker.com/engine/swarm/services/#placement-constraints )。