Docker/Flask:开发服务器在本地主机上运行良好,但无法访问外部 URL

时间:2021-07-01 17:54:35

标签: python docker flask

我是 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 进行测试时,我最终收到超时错误。我觉得这只是我在某处犯的一个小错误,但我看不到它。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

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

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

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