Docker容器部署极简Flask服务无法外部访问问题排查解决
Docker部署Flask服务外部无法访问排查解决
问题场景
在Windows原生环境可正常运行的极简Flask服务,迁移到Docker容器部署后外部无法访问。已按照通用排查方案配置Flask服务监听0.0.0.0地址,问题仍存在。
项目结构
├── application/ │ ├── Dockerfile │ ├── requirements.txt │ ├── service.py
配置与运行信息
Dockerfile配置
# syntax=docker/dockerfile:1 FROM python:3.6.5-alpine RUN apk --update add bash nano COPY requirements.txt /tmp/ RUN pip3 install -r /tmp/requirements.txt COPY . . ENV FLASK_ENV=development CMD ["python", "service.py"]
Flask服务代码(service.py)
from flask import Flask app = Flask(__name__) @app.route('/') def greetings(): return "Welcome my service!" if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
容器启动日志
容器以交互模式启动时日志输出无报错:
* Serving Flask app 'service' (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! * Debugger PIN: 277-473-905
异常现象
- 浏览器访问日志中输出的地址
http://172.17.0.2:5000时,页面长时间加载后提示无法访问,报错为ERR_CONNECTION_TIMED_OUT - Windows原生环境下通过以下命令启动服务可正常访问:
export FLASK_APP=service export FLASK_ENV=development flask run
- 已测试的容器启动命令:
docker run --rm -it scone:latest docker run --rm -p 5000:5000 scone:latest
解决方法
问题核心是访问方式错误,按以下要求操作即可正常访问:
- 启动容器时必须添加
-p 5000:5000参数,完成容器5000端口到宿主机5000端口的映射 - 无需访问容器日志输出的Docker内部IP地址(
172.17.0.2属于Docker网桥分配的内部网段地址,默认无法直接从宿主机外部访问),直接在宿主机浏览器访问http://localhost:5000即可正常打开服务。
内容的提问来源于stack exchange,提问作者Xavier Gravel
相关产品推荐
相关产品推荐

