Docker部署Flask应用仅能通过内部IP访问,localhost无法访问求助
Flask应用Docker部署后本地访问失败问题解决
问题描述
我为学习Docker与docker-compose搭建了一个简单的Flask应用。运行容器后,期望能通过http://127.0.0.1:5001访问应用,但实际上仅能通过Docker内部IP地址http://172.18.0.2:5001访问。
相关日志与配置
容器运行日志
web | * Running on all addresses (0.0.0.0) web | * Running on http://127.0.0.1:5001 web | * Running on http://172.18.0.2:5001 web | Press CTRL+C to quit web | * Restarting with stat web | * Debugger is active! web | * Debugger PIN: 359-467-367
docker-compose.yaml配置
version: '3.8' services: web: build: ./services/web container_name: web command: python manage.py run -h 0.0.0.0 volumes: - ./services/web/:/usr/src/app/ ports: - 5001:5000 environment: - FLASK_APP=project/__init__.py - FLASK_DEBUG=1 - FLASK_RUN_PORT=5001
Dockerfile配置
FROM python:3.11.3-slim-buster WORKDIR /usr/src/app ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 RUN pip install --upgrade pip COPY ./requirements.txt /usr/src/app/requirements.txt RUN pip install -r requirements.txt COPY . /usr/src/app/
Flask应用入口代码(init.py)
from flask import Flask, jsonify app = Flask(__name__) @app.route("/") def hello_world(): return jsonify(hello="world")
问题原因与解决方法
核心问题
容器内的Flask服务实际运行在5001端口(由环境变量FLASK_RUN_PORT=5001指定),但docker-compose的端口映射配置是5001:5000——将主机的5001端口转发到容器的5000端口,两者端口不匹配,导致本地请求无法命中容器内的服务端口。
解决方式二选一:
修改端口映射配置:将docker-compose.yaml中的
ports改为5001:5001,让主机5001端口直接转发到容器内服务运行的5001端口:ports: - 5001:5001统一服务运行端口:移除环境变量
FLASK_RUN_PORT=5001,让Flask默认运行在5000端口,保持现有端口映射5001:5000不变:environment: - FLASK_APP=project/__init__.py - FLASK_DEBUG=1
修改完成后,重新启动容器:
docker-compose down && docker-compose up --build
此时访问http://127.0.0.1:5001即可正常获取响应。
内容的提问来源于stack exchange,提问作者user5967613
相关产品推荐
相关产品推荐

