大家都知道,Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:python3.7 Tornado5.1.1 Celery3.1 Rabbitmq3.7.16实现异步队列任务 详细阐述了如何进行安装部署和使用,但是过程太繁琐了,先得安装Erlang,再安装rabbitmq,然后各种配置,最后由于async关键字问题还得去修改三方库的源码,其实我们可以通过docker来将celery服务封装成镜像,如此一来,以后再使用celery或者别的系统依赖celery,我们只需要将该镜像以容器的形式跑服务即可,不需要繁琐的配置与安装。
首先新建celery_with_docker文件夹,cd celery_with_docker
建立dockerfile文件
代码语言:javascript复制FROM python
LABEL author="liuyue"
LABEL purpose = ''
RUN apt update
RUN pip3 install setuptools
ENV PYTHONIOENCODING=utf-8
# Build folder
RUN mkdir -p /deploy/app
WORKDIR /deploy/app
#only copy requirements.txt. othors will be mounted by -v
#COPY app/requirements.txt /deploy/app/requirements.txt
#RUN pip3 install -r /deploy/app/requirements.txt
RUN pip3 install celery
# run sh. Start processes in docker-compose.yml
#CMD ["/usr/bin/supervisord"]
CMD ["/bin/bash"]
意思是基础镜像我们使用python,然后安装celery
然后新建docker-compose.yml
代码语言:javascript复制# Use postgres/example user/password credentials
version: '3.4'
services:
myrabbit:
#restart: always
#build: rabbitmq/
image: rabbitmq:3-management
# hostname: rabbit-taiga
environment:
RABBITMQ_ERLANG_COOKIE: SWQOKODSQALRPCLNMEQG
# RABBITMQ_DEFAULT_USER: "guest"
# RABBITMQ_DEFAULT_PASS: "guest"
# RABBITMQ_DEFAULT_VHOST: "/"
# RABBITMQ_NODENAME: taiga
RABBITMQ_DEFAULT_USER: liuyue
RABBITMQ_DEFAULT_PASS: liuyue
ports:
- "15672:15672"
# - "5672:5672"
api:
#restart: always
stdin_open: true
tty: true
build: ./
image: celery-with-docker-compose:latest
volumes:
- ./app:/deploy/app
ports:
- "80:80"
command: ["/bin/bash"]
celeryworker:
image: celery-with-docker-compose:latest
volumes:
- ./app:/deploy/app
command: ['celery', '-A', 'tasks', 'worker', '-c', '4', '--loglevel', 'info']
depends_on:
- myrabbit
这个配置文件的作用是,单独拉取rabbitmq镜像,启动rabbitmq服务,用户名和密码为:liuyue:liuyue然后在镜像内新建一个celery工程,目录放在/deploy/app,随后通过挂载文件夹的方式将宿主的app目录映射到/deploy/app,最后启动celery服务
最后,我们只需要在宿主机建立一个app文件夹,新建一些任务脚本即可
新建tasks.py
代码语言:javascript复制from celery import Celery
SERVICE_NAME = 'myrabbit'
app = Celery(backend = 'rpc://', broker = 'amqp://liuyue:liuyue@{0}:5672/'.format(SERVICE_NAME))
@app.task
def add(x, y):
print(123123)
return x y
新建任务调用文件test.py
代码语言:javascript复制import time
from tasks import add
# celery -A tasks worker -c 4 --loglevel=info
t1 = time.time()
result = add.delay(1, 2)
print(result.get())
print(time.time() - t1)
最后项目的目录结构是这样的
随后在项目根目录执行命令:docker-compose up --force-recreate
此时celery和rabbitmq服务已经启动
进入浏览器 http://localhost:15672 用账号登录 liuyue:liuyue
没有问题,此时我们进入容器内部
代码语言:javascript复制docker exec -i -t celery-with-docker-compose-master_api_1 /bin/bash
可以看到,容器内已经通过挂载将宿主机的app文件夹共享了进来
随后我们执行异步任务:python3 test.py
可以看到执行成功了
由此可知,在宿主机,什么环境都不需要配置,只需要安装一个docker即可,异步任务队列的搭建和执行全部在docker的内部容器内,完全隔绝,只是具体的代码和脚本通过docker的挂载命令来在宿主机编写,也就是研发人员只需要在宿主机专注编写代码,而不需要管配置和部署的问题。
最后,附上项目的完整代码:https://gitee.com/QiHanXiBei/celery-with-docker-composer