簡體   English   中英

是否可以從正在運行的 Docker 容器內部發送 HTTP 請求

[英]Is it possible to send HTTP requests from inside a running Docker container

我有一個基本的分布式系統,可以計算 Github 存儲庫所有提交的平均圈復雜度。 它由一個運行在 Flask 上的 Master 節點組成,當一組 Worker 節點向 Master 發送 GET 請求時,它會向一組 Worker 節點提供 SHA ID。

我正在嘗試使用 Docker 進行一些練習,並想將我的 Worker 代碼放在 Docker 容器中,然后將該容器放在一組遠程機器上,並讓 Master 在我的本地機器上運行。 我希望 Worker 和 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 的?

關於主要問題:正如您確認的那樣,這是一個網絡連接問題。 案件結案。 關於您的編輯:由於工作人員是發起連接的人(至少根據您的描述),您不需要在這些容器上公開任何端口。 Docker 使用 iptables 為容器出口流量設置 NAT(您可以使用iptables -L作為 root 在 Linux 主機上驗證這一點)。 這與在您的家庭網絡中相同,您可能有一些小型路由器為您的家庭執行 NAT。 如果您想訪問互聯網上的任何站點,則無需打開任何端口。 僅當容器中的某些內容實際偵聽它並且應該接收入口流量時,才需要公開端口。 希望現在更清楚了。

是的。 您可以制作一個包含本地機器和遠程機器的 docker swarm,然后將您的 worker 和 master 作為服務部署在同一個 docker 網絡中。 請參閱https://docs.docker.com/engine/swarm

要定位 swarm 上的特定機器,您需要標記它們並將標簽用作放置約束(請參閱https://docs.docker.com/engine/swarm/services/#placement-constraints ‌ )。

嘗試使用您的服務名稱而不是您的 ip,它應該會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM