首页 > 解决方案 > Docker/Flask:开发服务器在 localhost 上运行良好,但无法访问外部 URL

问题描述

我是 Docker 的新手,所以我认为我的设置有问题。

这是我的app.py(简化版):

import flask
from flask import request
from flask_cors import CORS, cross_origin

app = flask.Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

@app.route('/', methods=['GET'])
@cross_origin()
def index():
    return('Home')

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

我的Dockerfile

FROM python:3

WORKDIR /app

ENV FLASK_APP=app.py

COPY ./requirements.txt .

RUN pip3 install -r requirements.txt

COPY . .

CMD ["python3", "app.py"]

我正在使用它构建图像docker build -t flaskapi .并运行它, docker run --rm -it -p 80:5000 flaskapi它会给出以下输出:

* Serving Flask app "app" (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!

在浏览器中访问localhost,一切正常,但在尝试http://172.17.0.2:5000/使用 Postman 访问或测试时,我最终收到超时错误。我觉得这只是我在某个地方犯的一个小错误,但我看不出来。我能做些什么来解决这个问题?

标签: pythondockerflask

解决方案


默认情况下,Docker 在外部世界无法访问的单独子网中运行。为了能够访问在容器内运行的服务,您必须将主机的一个端口映射到内部 docker 子网。

-p 80:5000在您的运行命令中,您将 docker 网络(部分)内的 TCP 80 映射到 TCP 5000 。这就是访问时可以访问您的服务的原因http://localhost(隐含 80)。本质上,对端口 80 的任何请求最终都将由运行在 http://172.17.0.2:5000/.

172.*ip 在 Docker 的子网范围内。要通过它进行通信,使用您当前的设置,您必须在另一个与此共享相同网络的容器中。


推荐阅读