[英]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.