Docker部署Flask应用后无法通过localhost访问的问题求助
Flask容器化后本地无法访问的排查与解决
我开发了一个Python Flask应用,本地运行正常,容器化后用Docker启动,访问http://localhost:5000/时提示:
连接已重置
以下是我的配置文件与已做排查:
docker-compose配置
version: '3.8' services: elasticsearch: container_name: elasticsearch image: elasticsearch:8.15.2 ports: - "9200:9200" - "9300:9300" environment: - discovery.type=single-node - xpack.security.enabled=false healthcheck: test: ["CMD", "curl", "-f", "http://elasticsearch:9200"] interval: 30s timeout: 10s retries: 5 networks: - mynetwork flaskapp: container_name: flaskapp build: . ports: - "5000:5000" depends_on: elasticsearch: condition: service_healthy networks: - mynetwork networks: mynetwork: driver: bridge
Dockerfile配置
FROM python:3.12 WORKDIR /IoT COPY Pipfile Pipfile.lock /IoT/ RUN pip install pipenv && pipenv install --deploy --ignore-pipfile COPY . /IoT/ EXPOSE 5000 CMD ["pipenv", "run", "python", "app.py"]
启动命令:
docker-compose up -d
核心Python代码
# app/__init__.py from flask import Flask from .routes import main_blueprint from elasticsearch import Elasticsearch def create_app(): app = Flask(__name__) app.elasticsearch = Elasticsearch(["http://elasticsearch:9200"]) app.register_blueprint(main_blueprint) return app # app.py from app import create_app app = create_app() if __name__ == "__main__": app.run(host="0.0.0.0", port=5000)
已做排查
- 容器内部访问
http://localhost:5000可正常返回模板,确认应用在容器内运行正常 - 尝试通过容器IP访问(命令:
docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" flaskapp),仍无法访问 - 容器日志显示应用已正确绑定
0.0.0.0:5000:
* Serving Flask app 'app' 2024-10-06T13:42:40.797064320Z * Debug mode: off 2024-10-06T13:42:40.798759487Z WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. 2024-10-06T13:42:40.798818089Z * Running on all addresses (0.0.0.0) 2024-10-06T13:42:40.798832090Z * Running on http://127.0.0.1:5000 2024-10-06T13:42:40.798841090Z * Running on http://x.x.x.x:5000 2024-10-06T13:42:40.798850190Z Press CTRL+C to quit
解决方向
- 检查端口占用:用
lsof -i :5000(Linux/macOS)或netstat -ano | findstr :5000(Windows)确认本地5000端口是否被其他程序占用,若占用则更换映射端口 - 排查防火墙拦截:临时关闭本地防火墙或安全软件,测试是否能正常访问
- 调整Docker网络模式:Linux/macOS环境下可尝试将flask服务改为host网络模式,修改docker-compose配置:
flaskapp: ... network_mode: host # 注释原ports和networks配置 # ports: # - "5000:5000" # networks: # - mynetwork - 排除虚拟环境问题:替换Pipenv为直接pip安装,修改Dockerfile:
FROM python:3.12 WORKDIR /IoT COPY requirements.txt . RUN pip install -r requirements.txt COPY . /IoT/ EXPOSE 5000 CMD ["python", "app.py"] - 验证端口映射状态:执行
docker-compose ps查看flaskapp的端口映射是否显示为0.0.0.0:5000->5000/tcp,若异常则重启容器或重新构建镜像
内容的提问来源于stack exchange,提问作者Hugocrt
相关产品推荐
相关产品推荐

