Docker化项目时Celery容器无法连接Redis的问题求助
问题:Docker化旧项目时Redis连接失败(Error 99 Address not available)
错误信息
Traceback (most recent call last): File "/venv/lib/python3.10/site-packages/redis/connection.py", line 624, in connect sock = self.retry.call_with_retry( File "/venv/lib/python3.10/site-packages/redis/retry.py", line 46, in call_with_retry return do() File "/venv/lib/python3.10/site-packages/redis/connection.py", line 625, in <lambda> lambda: self._connect(), lambda error: self.disconnect(error) File "/venv/lib/python3.10/site-packages/redis/connection.py", line 690, in _connect raise err File "/venv/lib/python3.10/site-packages/redis/connection.py", line 678, in _connect sock.connect(socket_address) OSError: [Errno 99] Address not available During handling of the above exception, another exception occurred: ... Exception Type: OperationalError at / Exception Value: Error 99 connecting to localhost:6379. Address not available.
核心原因
Docker容器内的localhost指向容器自身,而非宿主机。如果项目配置中仍使用localhost:6379连接Redis,容器内无法找到对应的Redis服务,导致连接失败。
解决步骤
1. 配置Docker Compose包含Redis服务
在项目根目录创建或修改docker-compose.yml,添加Redis服务并确保web服务与Redis在同一网络:
version: '3.8' services: redis: image: redis:latest restart: always ports: - "6379:6379" web: build: . restart: always depends_on: - redis environment: - REDIS_HOST=redis # 使用Docker服务名作为Redis地址 - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0
2. 更新项目中的Redis连接配置
- 修改Django的
settings.py,将Redis相关配置中的localhost替换为redis:
# Celery配置 CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', 'redis://redis:6379/0') CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', 'redis://redis:6379/0') # 其他直接连接Redis的代码 REDIS_CONNECTION = redis.Redis(host=os.environ.get('REDIS_HOST', 'redis'), port=6379, db=0)
3. 重启并验证服务
- 启动所有服务:
docker-compose down && docker-compose up -d
- 查看Redis容器日志确认服务正常运行:
docker logs <your-redis-container-name>
- 查看web容器日志,确认连接错误已解决:
docker logs <your-web-container-name>
4. 额外检查点
- 确保Redis容器没有被防火墙或安全组阻断端口
- 确认所有依赖Redis的服务(如Celery worker)也使用相同的Redis地址配置
内容的提问来源于stack exchange,提问作者Matheus Loeblein
相关产品推荐
相关产品推荐

