【问题标题】:Docker/Flask: Development server runs on localhost fine, but cannot access external URLDocker/Flask:开发服务器在 localhost 上运行良好,但无法访问外部 URL
【发布时间】:2021-07-01 17:54:35
【问题描述】:

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

【问题讨论】:

    标签: python docker flask


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了,看来我对 Docker 的工作方式有误解。所以实际上,如果我可以访问http://localhost 很好,那么一切都会按预期工作。然后实际上说容器托管在某个地方我必须使用像 Heroku 这样的东西吗?
    猜你喜欢
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2016-10-05
    • 1970-01-01
    相关资源
    最近更新 更多