簡體   English   中英

最小的 Flask 應用程序無法從 Docker 容器訪問

[英]Minimal Flask app unreachable from Docker container

我有一個非常簡單的燒瓶服務,我試圖在 docker 容器中運行。
我使用 python 實現了一個最小的應用程序,它在我的 Windows 上運行良好,但在 Docker 容器中時無法訪問。
我嘗試了設置 --host=0.0.0.0 的常見修復方法(嘗試了多種方法),但它並沒有解決我的問題。

項目結構:
├── 應用/
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── service.py

Dockerfile:

# syntax=docker/dockerfile:1

FROM python:3.6.5-alpine

RUN apk --update add bash nano

COPY requirements.txt /tmp/
RUN pip3 install -r /tmp/requirements.txt

COPY . .

ENV FLASK_ENV=development
CMD ["python", "service.py"]  

服務.py:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def greetings():
    return "Welcome my service!"

if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0')

最后,這是我以交互模式啟動 Docker 映像時的日志:

[...]/.venv/Scripts/Activate.ps1"
 * Serving Flask app 'service' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 277-473-905

所以似乎沒有問題,但是當我使用瀏覽器(谷歌瀏覽器)訪問控制台中顯示的地址時,它只會永遠加載然后顯示該站點無法訪問( ERR_CONNECTION_TIMED_OUT )。
此外,我可以通過從 bash 終端鍵入以下命令,從本機操作系統運行燒瓶,而不會出現問題:

export FLASK_APP=service
export FLASK_ENV=development
flask run

誰能幫我理解為什么它不能在 Docker 容器中工作? 它從外部工作,我認為添加host='0.0.0.0'應該使容器可以從外部訪問。

編輯: docker 命令測試:

docker run --rm -it  scone:latest
docker run --rm -p 5000:5000 scone:latest

解決
正如 u/OneCricketeer 所提到的,訣竅是在 docker run 中使用-p 5000:5000參數,現在您可以使用到達容器但您必須忽略 docker 終端中給出的地址。 改用它: http://localhost:5000 (如果您從 docker 容器外部運行燒瓶,它將為您提供的 ip。)

您可能會看到的問題是您的 Windows 主機無法訪問 docker 容器。 網絡不會暴露給您的主機,因此您需要在 docker 命令行中包含-p 5000:5000選項,以告訴 docker 將主機端口 5000 轉發到 docker 容器端口 5000。

簡而言之:

docker run --rm -it -p 5000:5000  scone:latest

用這個 Dockerfile 測試

# syntax=docker/dockerfile:1

FROM python:3.10-alpine

RUN ["python", "-m", "pip", "install", "flask"]

COPY service.py .

CMD ["python", "service.py"]

運行

$ docker build -t tmp-flask .
$docker run --rm -e FLASK_ENV=development -p 5000:5000 tmp-flask
 * Serving Flask app 'service' (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on all addresses (0.0.0.0)
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://127.0.0.1:5000
 * Running on http://172.17.0.2:5000 (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 248-506-880

從另一個終端

$ curl localhost:5000
Welcome my service!

暫無
暫無

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

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