我是 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 进行测试时,我最终收到超时错误。我觉得这只是我在某处犯的一个小错误,但我看不到它。我该怎么做才能解决这个问题?
答案 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 的子网范围内。要通过它进行通信,使用您当前的设置,您必须位于与此共享同一网络的另一个容器中。