flask应用必须绑定0.0.0.0才能被外部访问,因127.0.0.1仅监听容器回环接口,导致宿主机和外部无法连接;正确方式是app.run(host='0.0.0.0', port=5000),并配合docker run -p 5000:5000映射。

Flask应用启动时必须绑定 0.0.0.0 而非 127.0.0.1
容器内部网络和宿主机是隔离的,app.run(host='127.0.0.1') 会导致服务只监听容器本地回环,外部无法访问。不改这个,容器跑起来也 curl 不通、浏览器打不开。
- 必须写成
app.run(host='0.0.0.0', port=5000) - 生产环境建议换
gunicorn启动,但开发阶段直接改 host 就行 - 如果用了
debug=True,确保它只在开发启用(Docker 构建时不应暴露 debug 模式)
Dockerfile 中 pip install 要加 --no-cache-dir 且优先 COPY requirements.txt 单独安装
Docker 镜像层缓存机制会让 requirements.txt 变更时跳过整个 COPY . . 后的安装步骤,导致依赖没更新。常见错误是把 COPY . . 放在 RUN pip install 前面。
- 正确顺序:
COPY requirements.txt .→RUN pip install --no-cache-dir -r requirements.txt→COPY . . -
--no-cache-dir防止 pip 缓存在镜像里膨胀体积(尤其 CI/CD 环境) - 不要用
python:3.9这类带补丁号的镜像标签(如python:3.9.18),优先选python:3.9-slim或python:3.11-slim-bookworm,更小、更稳定
docker run 映射端口时 -p 5000:5000 容易漏掉宿主机端口前置
命令写成 docker run -p 5000 python-flask-app 是错的——这只会随机映射宿主机端口,不是固定 5000。你本地 curl localhost:5000 会失败。
- 正确写法必须是
-p 5000:5000(左宿主右容器),顺序不能反 - 若提示
port is already allocated,先docker ps查 PID,再docker stop <id></id> - Windows/macOS 用户注意 Docker Desktop 是否已启动,否则
docker run会卡住无响应
多服务用 docker-compose.yml 时 redis/flask 网络互通关键在 service 名当 host
比如 Flask 里连 Redis 写 redis.Redis(host='localhost') 是错的——容器内没有 localhost 指向 redis 服务。Docker Compose 默认为每个 service 创建 DNS 记录,名字即 host。
- Flask 代码中应写
redis.Redis(host='redis', port=6379)(service 名是redis) -
docker-compose.yml里不要手动设networks:,除非跨 compose 文件通信 -
depends_on只控制启动顺序,不保证服务就绪;需在 Flask 启动前加重试逻辑(如循环检查redis.ping())
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











