python - 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 访问或测试时,我最终收到超时错误。我觉得这只是我在某个地方犯的一个小错误,但我看不出来。我能做些什么来解决这个问题?
解决方案
默认情况下,Docker 在外部世界无法访问的单独子网中运行。为了能够访问在容器内运行的服务,您必须将主机的一个端口映射到内部 docker 子网。
-p 80:5000
在您的运行命令中,您将 docker 网络(部分)内的 TCP 80 映射到 TCP 5000 。这就是访问时可以访问您的服务的原因http://localhost
(隐含 80)。本质上,对端口 80 的任何请求最终都将由运行在 http://172.17.0.2:5000/
.
172.*
ip 在 Docker 的子网范围内。要通过它进行通信,使用您当前的设置,您必须在另一个与此共享相同网络的容器中。
推荐阅读
- ruby-on-rails - RSpec:工厂级别的停止/存根 after_create 回调?
- python - 对 1000 万对 1x20 向量执行余弦相似度的最快方法
- javascript - 使用 JS 向表单添加输入
- django - Django FieldType 默认字符串参数的用途
- jquery - 使用 jQuery 删除现有文本前面的数字
- python - 如何使用python将字符串插入浏览器文本字段
- google-play-games - 在我使用 Google Play 游戏的游戏中,如何获取玩家的排名和提交的分数?
- ios - AudioKit - 在没有操场的情况下绘制文件的完整波形
- javascript - JQuery data() 设置不持久
- io - Octave / CLI -- 在同一控制台线上保持长输出