根本原因是Redis容器未就绪且DNS解析依赖配置错误:Python应用中host='redis'必须严格匹配docker-compose.yml中redis服务名,容器间通信需同网络,depends_on仅控启动顺序不保服务就绪,须配healthcheck与service_healthy条件或重试逻辑。

直接能跑通,但默认配置下 Redis 连不上——根本原因是 Python 应用容器启动时,Redis 容器可能还没就绪,且 host='redis' 依赖 Docker 内置 DNS,必须确保服务名、网络和启动顺序都对。
docker-compose.yml 里 redis 服务名必须是 "redis"
Flask 或其他 Python 代码里写 Redis(host='redis', port=6379),这个 'redis' 不是随便起的,它对应 docker-compose.yml 中 services 下的键名。Docker Compose 会自动为每个 service 创建同名 DNS 记录,供其他容器解析。
- 如果写成
redis-server:或cache:,Python 就会报redis.exceptions.ConnectionError: Error 111 connecting to redis:6379. Connection refused. - 端口映射
"6379:6379"只影响宿主机访问,容器间通信走内部网络,用默认6379即可,不用改 - 不要加
network_mode: "host"——这会让容器脱离 Compose 自建网络,'redis'解析失效
Python 容器启动前必须等 Redis ready
默认 depends_on 只检查容器是否“已启动”,不检查 Redis 服务是否真正可连接。结果常是 Python 进程先跑起来,一连就失败。
- 正确做法:在
docker-compose.yml的 web 服务里加健康检查 +restart: on-failure,或改用wait-for-it.sh脚本 - 简易方案:在
app.py的get_hit_count()函数里加重试逻辑(如知识库中示例的retries = 5循环) - 更可靠:用
docker-compose.yml的healthcheck配合condition: service_healthy,例如给 redis 加:
redis:
image: redis:alpine
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
再在 web 服务里写 depends_on: { redis: { condition: service_healthy } }
立即学习“Python免费学习笔记(深入)”;
requirements.txt 和镜像基础要匹配
Alpine 镜像(如 python:3.9-alpine)用的是 musl libc,某些 Python 包(尤其是带 C 扩展的)在 Alpine 上编译容易出错,redis 包本身没问题,但如果你后续加 psycopg2 或 mysqlclient 就可能失败。
- 开发阶段建议用
python:3.9-slim(基于 Debian),兼容性更好,体积也不大 - 确保
requirements.txt明确包含redis和flask,别漏掉redis——只装flask是连不上 Redis 的 - Dockerfile 中
RUN pip install -r requirements.txt必须在COPY requirements.txt .之后,否则缓存失效或安装空包
本地调试时别忘了端口映射和 host 绑定
Flask 默认只监听 127.0.0.1:5000,而容器内 127.0.0.1 指自己,不是宿主机。所以必须显式设 host='0.0.0.0',否则 docker-compose up 启动后,宿主机 curl localhost:5000 会超时。
- app.py 中启动行要写成:
app.run(host="0.0.0.0", port=5000, debug=True) -
docker-compose.yml的 web 服务必须有ports: ["5000:5000"](或你想要的宿主端口) - 如果用 Gunicorn,CMD 要带
--bind 0.0.0.0:5000,不能只写app:app
最易被忽略的一点:所有容器共享同一个默认网络,但这个网络是 Compose 自动创建的;一旦你手动删过 docker network prune,旧 compose 项目重启时可能因网络残留冲突导致 DNS 解析失败——此时 docker-compose down && docker-compose up -d 是最快恢复方式。


















