Docker化Flask服务无法外部访问端点问题求助
Docker容器中Flask+Gunicorn应用外部无法访问排查方案
问题背景
我用Docker部署了基于Gunicorn的Flask应用,相关配置及当前状态如下:
Dockerfile
FROM python:3.11-slim WORKDIR /app RUN apt-get update && apt-get install -y \ libmagic1 \ curl \ && rm -rf /var/lib/apt/lists/* COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV PYTHONUNBUFFERED=1 CMD [ "gunicorn", "--workers", "2", "--threads", "2", "-b", "0.0.0.0:5000", "--timeout", "1000", "app:app"]
docker-compose.yml
services: flask-api: build: . ports: - "0.0.0.0:5000:5000" volumes: - .env:/app/.env:ro
应用代码(app.py)
from flask import Flask app = Flask(__name__) CORS(app) @app.route("/") def index(): return "Hello from the endpoint!"
- 容器内部通过
docker exec -it flask_server_flask-api_1 curl http://127.0.0.1:5000/可正常返回Hello from the endpoint! - 容器外部执行
curl http://127.0.0.1:5000返回curl: (56) Recv failure: Connection reset by peer - 已规避绑定
localhost/127.0.0.1的常见问题,但问题仍存在
排查步骤及解决方案
1. 确认容器内部监听状态
先检查Gunicorn是否真的在0.0.0.0:5000端口监听:
docker exec flask_server_flask-api_1 netstat -tulpn
如果输出无0.0.0.0:5000的监听记录:
- 验证
app:app的正确性:确保app.py在容器工作目录/app下,且Flask实例名称确实为app - 查看容器启动日志排查Gunicorn启动异常:
docker logs flask_server_flask-api_1
根据日志提示修复依赖缺失、模块找不到等问题。
2. 验证宿主机端口映射状态
检查宿主机是否正常监听5000端口:
netstat -tulpn | grep 5000
如果宿主机无对应监听:
- 检查端口是否被其他进程占用:
lsof -i :5000
停止占用进程或修改docker-compose.yml中的映射端口
- 重建容器服务:
docker-compose down && docker-compose up --build -d
3. 检查防火墙/安全组规则
- 宿主机防火墙开放5000端口:
- ufw:
ufw allow 5000/tcp - firewalld:
firewall-cmd --add-port=5000/tcp --permanent && firewall-cmd --reload
- ufw:
- 云服务器需同步配置平台安全组的5000端口入站规则
4. 排除CORS扩展干扰
临时注释app.py中的CORS(app)代码,重启容器后测试外部访问,排除CORS扩展导致的连接异常。
5. 测试Docker网络模式
切换至host网络模式排查(仅用于测试,生产环境不推荐):
修改docker-compose.yml:
services: flask-api: build: . network_mode: host volumes: - .env:/app/.env:ro
重启服务后访问http://127.0.0.1:5000,若能正常访问则说明bridge网络转发存在问题,可尝试重启Docker服务:
systemctl restart docker
内容的提问来源于stack exchange,提问作者GitCrush
相关产品推荐
相关产品推荐

