Docker下Python Flask+Redis+MySQL+RQ队列简单配置
本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇
作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的
version
关键点在于rq部分:
rq
使用command命令启动RQ队列:
command
在Flask的配置文件config.py中如下编写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import os import redis from rq import Queue ''' 配置文件: debug=true secret_key,session中的24位随机盐值 MySQL数据库配置 数据库名为SZheScan python3:https://blog.csdn.net/qq562029186/article/details/81325074 ''' DEBUG = False SECRET_KEY = os.urandom( 24 ) HOSTNAME = 'mysql' # HOSTNAME='127.0.0.1' PORT = '3306' DATABASE = 'SZheScan' USERNAME = 'root' PASSWORD = 'root' # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8' . format (USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = False HOST = 'redis' # HOST = '127.0.0.1' redisPool = redis.ConnectionPool(host = HOST, port = 6379 , db = 0 , decode_responses = True ) db = redis.Redis(host = HOST, port = 6379 , db = 0 , decode_responses = True ) queue = Queue(connection = db) |
除了引入关键的库文件之外,RQ队列关键代码在:
1 2 | db = redis.Redis(host = HOST, port = 6379 , db = 0 , decode_responses = True ) queue = Queue(connection = db) |
注意,这里链接的HOST不能是本地127.0.0.1,而是redis,而redis实际上是docker-compose.yaml文件里面redis的服务名,也就是redis服务,这样才能正常通信。
接着使用docker-compose up 启动服务,但是出现了报错为:
Error 99 connecting to localhost:6379. Cannot assign requested address
虽然国内部分人给出了解决方案,但是并不太具体,在stackoverflow社区上找到了其中一个解决方案:https://stackoverflow.com/questions/54965291/error-99-connecting-to-localhost6379-cannot-assign-requested-address
事实上,这个解决方案,解决的问题是前面我们提到的,HOST主机修改为redis服务名的问题,但是当我这样修改了之后,并且重新建立了镜像,还是会出现同样的报错。
在查阅了相关的资料之后,作者才发现,原来RQ队列默认链接的就是本地的Redis数据库,即localhost:6379,虽然我们在配置文件,即config.py里面写了:
1 | db = redis.Redis(host = HOST, port = 6379 , db = 0 , decode_responses = True ) |
但是RQ队列并不会智能到自动链接redis Docker服务,最终还是一次又一次去尝试链接localhost:6379,这也是为什么Docker的报错里面会出现localhost:6379的原因。
解决方法为,docker-compose.yml启动文件中,RQ队列启动command命令指定配置文件启动
简单介绍一下咋编写配置文件及启动服务,更详细的可以去查看其他博主的RQ队列配置文件编写
首先编写一个rqsettings.py文件:
1 2 3 4 5 6 7 8 | # 你也可以指定使用的redis数据库 REDIS_HOST = 'redis' REDIS_PORT = 6379 REDIS_DB = 0 # REDIS_PASSWORD = 'very secret' # 监听的队列 QUEUES = [ 'high' , 'default' , 'low' ] |
可以看到在这里我们指定的是redis主机,即docker-compose.yml文件中redis docker的服务名,在stackoverflow解决方案上,也是想表达改为docker redis的服务名。
接着在config.py中,还是象征性改一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | import os import redis from rq import Queue import rqsettings ''' 配置文件: debug=true secret_key,session中的24位随机盐值 MySQL数据库配置 数据库名为SZheScan python3:https://blog.csdn.net/qq562029186/article/details/81325074 ''' DEBUG = False SECRET_KEY = os.urandom( 24 ) HOSTNAME = 'mysql' # HOSTNAME='127.0.0.1' PORT = '3306' DATABASE = 'SZheScan' USERNAME = 'root' PASSWORD = 'root' # SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8' SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8' . format (USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = False HOST = 'redis' # HOST = '127.0.0.1' redisPool = redis.ConnectionPool(host = HOST, port = 6379 , db = 0 , decode_responses = True ) db = redis.Redis(host = rqsettings.REDIS_HOST, port = rqsettings.REDIS_PORT, db = rqsettings.REDIS_DB, decode_responses = True ) queue = Queue(connection = db) |
其实这个改不改都行,RQ指定host和端口改为了调用rqsettings文件而已。
最关键的在于指定配置文件启动,修改docker-compose.yml文件为
version: '3'
services:
redis:
image: "redis"
restart: always
environment:
- TZ=Asia/Shanghai
mysql:
build: ./mysql
environment:
- TZ=Asia/Shanghai
- MYSQL_DATABASE=SZheScan
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
restart: always
command: [
'--character-set-server=utf8mb4',
'--collation-server=utf8mb4_unicode_ci',
]
web:
build: .
ports:
- "5000:5000"
links:
- mysql:mysql
- redis:redis
depends_on:
- mysql
restart: always
environment:
- TZ=Asia/Shanghai
rq:
build: .
depends_on:
- redis
- web
command: "rq worker -c rqsettings"
restart: always
environment:
- TZ=Asia/Shanghai
关键代码为:
command
即使用
rq worker -c rqsettings
-c 参数指定配置文件
需要注意的是,配置文件实际上为rqsettings.py,是存在.py后缀的,但是在-c指定的时候,是不需要加上.py后缀指定的。
然后删除掉之前错误建立的镜像,重新更新一下本地的docker,对于这个问题,即:
Error 99 connecting to localhost:6379. Cannot assign requested address
应该就可以正常解决了。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!