大家都知道,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文件
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
# 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
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
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
没有问题,此时我们进入容器内部
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