本篇博文主要讲解Docker下使用RQ队列的通信配置,主要是网上的部分文章写的不太清楚,特写一篇

作者使用docker-compose.yml文件调度各部分文件Dockerfile,起初是这样写的

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"
  restart: always
  environment:
    - TZ=Asia/Shanghai

关键点在于rq部分:

  rq:
  build: .
  depends_on:
    - redis
    - web
  command: "rq worker"
  restart: always
  environment:
    - TZ=Asia/Shanghai

使用command命令启动RQ队列:

command: "rq worker"

在Flask的配置文件config.py中如下编写:

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队列关键代码在:

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里面写了:

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文件:

​
# 你也可以指定使用的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中,还是象征性改一下:

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"

即使用

rq worker -c rqsettings

-c 参数指定配置文件

需要注意的是,配置文件实际上为rqsettings.py,是存在.py后缀的,但是在-c指定的时候,是不需要加上.py后缀指定的。

然后删除掉之前错误建立的镜像,重新更新一下本地的docker,对于这个问题,即:

Error 99 connecting to localhost:6379. Cannot assign requested address

应该就可以正常解决了。

祝好

Docker下Python Flask+Redis+MySQL+RQ队列简单配置的更多相关文章

  1. ubuntu下python flask环境搭建

    ubuntu下python flask环境搭建 1. 安装pip sudo apt-get install python-dev pyhton-pip 2. 安装virtualenv sudo apt ...

  2. [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)

    [评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...

  3. python——flask常见接口开发(简单案例)

    python——flask常见接口开发(简单案例)原创 大蛇王 发布于2019-01-24 11:34:06 阅读数 5208 收藏展开 版本:python3.5+ 模块:flask 目标:开发一个只 ...

  4. Linux安装MariaDB(Mysql)和简单配置 mariadb

    Linux安装MariaDB(Mysql)和简单配置 1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动Ma ...

  5. Laravel5.4 队列简单配置与使用

    概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...

  6. windows下python+flask环境配置详细图文教程

    本帖是本人在安装配置python和flask环境时所用到的资源下载及相关的教程进行了整理罗列,来方便后面的人员,省去搜索的时间.如果你在安装配置是存在问题可留言给我. 首先罗列一下python+fla ...

  7. docker下tomcat连redis

    之前已经讲了然后通过Maven 项目管理工具创建Web项目, 最后打包成War包 讲了docker 配置 Tomcat , Redis 现在讲如何使用War包,以及在docker下, 让jsp连上re ...

  8. Linux安装MariaDB(Mysql)和简单配置

    1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...

  9. python的IDE(pycharm)安装以及简单配置

    使用IDE的好处 界面更友好,看起来更舒服 智能提示功能很赞,大大提高开发效率 pycharm的安装过程 去pycharm官网下载安装包,请下载专业版,建议不要去网上下载汉化版 点击安装包一直下一步即 ...

随机推荐

  1. .NET 5 中的隐藏特性

    前言 双十一当天 .NET 5 正式发布带来了很多的新特性和改进,个人觉得非常香,并且花了 10 分钟时间就把自己的 4 个 .NET Core 3.1 的项目升级到了 .NET 5,堪称无痛. 但是 ...

  2. JavaScript变量污染

    定义过多的全局变量,有可能造成全局变量冲突,这种现象称为变量污染. 全局变量在全局作用域内外都是可见的.若是已经声明了一个全局变量,再以相同的关键字和标识符重新声明全局变量,后者的赋值会替代前者的赋值 ...

  3. binary hacks读数笔记(装载)

    1.地址空间 在linux系统中,每个进程拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小是由计算机硬件决定的,具体地说,是由CPU的位数决定的.比如,32位硬件平台决定的虚拟地址空间大小:0--2 ...

  4. python之迭代锁与信号量

    如果现在需要在多处加锁大于等于2的时候 因为计算机比较笨,当他锁上一把锁的时候又所理一把锁,等他来开锁的时候他不知道用哪把钥匙来开锁, 所以这个时候我们需要把把平常的锁变为迭代锁 eg: import ...

  5. 内核补丁热更新ceph内核模块

    前言 内核模块的更新一般需要卸载模块再加载,但是很多时候使用场景决定了无法做卸载的操作,而linux支持了热更新内核模块的功能,这个已经支持了有一段时间了,一直没有拿ceph的相关模块进行验证 准备工 ...

  6. Nacos服务发现源码解析

    1.Spring服务发现的统一规范 Spring将这套规范定义在Spring Cloud Common中 discovery包下面定义了服务发现的规范 核心接口:DiscoveryClient 用于服 ...

  7. Pinpoint 编译环境搭建(Pinpoint系列一)

    本文基于 Pinpoint 2.1.0 版本 目录 一.2.1.0 版本特性 二.编译环境准备 三.编译注意事项 四.编译目录 五.注意事项 新版本的内容参考官方文档, Pinpoint的整个搭建是历 ...

  8. 算法基础——KMP字符串匹配

    原题链接 题目: 给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入 ...

  9. celery原理与组件

    1.Celery介绍 https://www.cnblogs.com/xiaonq/p/11166235.html#i1 1.1 celery应用举例 Celery 是一个 基于python开发的 分 ...

  10. (原创)用.NET Core实现一个在线客服系统(上篇)

    前言 没有视频的介绍显得尤为空白仓促.所以,如果你不赶时间,看看视频先 → → 戳我看视频 ← ←  在线演示访客端:http://role.fuyue.xyz/visitor/index客服端:ht ...