簡體   English   中英

Docker 容器中的 Gunicorn Flask 應用程序未暴露

[英]Gunicorn Flask application in Docker Container not getting Exposed

容器內的應用程序無法從外部訪問,即如果我執行到 docker 容器並執行

curl localhost:5000 

它工作正常,但不能在我電腦的瀏覽器上運行我收到錯誤:無法訪問此站點

我的 Dockerfile:

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

# Set the working directory to /app
WORKDIR /web-engine

# Copy the current directory contents into the container at /app
COPY . /web-engine

# Install Gunicorn3
RUN apt-get update && apt-get install default-libmysqlclient-dev gcc -y

# Install any needed packages specified in requirements.txt
RUN pip3 install --trusted-host pypi.python.org -r requirements.txt

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

# Define environment variable
ENV username root

# Run app.py when the container launches
CMD gunicorn --workers 4 --bind 127.0.0.1:5000 application:app --threads 1

UPON 以這種方式執行 docker:

sudo docker run -e password=$password -p 5000:5000 $reg/web-engine:ve0.0.2

我得到以下輸出:

[2019-09-08 11:53:36 +0000] [6] [INFO] Starting gunicorn 19.9.0
[2019-09-08 11:53:36 +0000] [6] [INFO] Listening at: http://127.0.0.1:5000 (6)
[2019-09-08 11:53:36 +0000] [6] [INFO] Using worker: sync
[2019-09-08 11:53:36 +0000] [9] [INFO] Booting worker with pid: 9
[2019-09-08 11:53:36 +0000] [10] [INFO] Booting worker with pid: 10
[2019-09-08 11:53:36 +0000] [11] [INFO] Booting worker with pid: 11
[2019-09-08 11:53:36 +0000] [12] [INFO] Booting worker with pid: 12

如您所見,我將容器的端口 5000 映射到計算機的端口 5000,但 localhost:5000 不起作用

因此,我嘗試了相同的方法,但使用 Flask 的開發服務器,在我的 dockerfile 中進行了以下更改

CMD gunicorn --workers 4 --bind 127.0.0.1:5000 application:app --threads 1

CMD python3.7 application.py

它奏效了; 我轉到 localhost:5000 並看到應用程序正在運行

應用程序沒有任何問題。 我想 gunicorn 服務器有錯誤

requirements.txt 文件:

Flask
Flask-SQLAlchemy
mysqlclient
gunicorn
bs4
html5lib

請幫幫我

我還嘗試了不同形式的 gunicorn 和 docker run 命令組合,例如

CMD gunicorn -application:app && sudo docker run -e password=$password -p 5000:8000 $reg/web-engine:ve0.0.2

它沒有與開發服務器一起工作的容器的終端圖像

我希望有一個解決方案,不涉及這里提到的任何內容,如 nginx、主管等某人請見鬼去吧……😢

默認情況下,127.0.0.1 意味着容器內部與外部不同。 使用0.0.0.0:5000代替。

擴展另一個答案:Docker 端口轉發的工作方式是從主機上的 IP 轉發到容器中的一個地址。 具體來說,是與將容器連接到主機網絡的 Docker 橋接網絡通信的外部地址。 它無法與容器上的127.0.0.1 ,因為這是一個私有127.0.0.1主機有自己的127.0.0.1

因此,您需要綁定到該 Docker 橋接網絡,或者通過綁定到0.0.0.0來綁定到所有接口,這是最簡單的解決方案。

用散文解釋這個有點棘手,但我有更長的版本,其中還包括圖表,因此可能更容易理解: https : //pythonspeed.com/articles/docker-connection-refused/

在你的 Dockerfile 中試試這個命令:

CMD ["flask", "run", "--host=0.0.0.0"]

暫無
暫無

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

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