原文转载自「刘悦的技术博客」https://v3u.cn/a_id_115

大家都知道,Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,在之前的一篇文章中:python3.7+Tornado5.1.1+Celery3.1+Rabbitmq3.7.16实现异步队列任务详细阐述了如何进行安装部署和使用,但是过程太繁琐了,先得安装Erlang,再安装rabbitmq,然后各种配置,最后由于async关键字问题还得去修改三方库的源码,其实我们可以通过docker来将celery服务封装成镜像,如此一来,以后再使用celery或者别的系统依赖celery,我们只需要将该镜像以容器的形式跑服务即可,不需要繁琐的配置与安装。

首先新建celery_with_docker文件夹,cdcelery_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

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_115

使用Docker-compose来封装celery4.1+rabbitmq3.7服务,实现微服务架构的更多相关文章

  1. 基于Docker Compose的.NET Core微服务持续发布

    是不是现在每个团队都需要上K8s才够潮流,不用K8s是不是就落伍了.今天,我就通过这篇文章来回答一下. 一.先给出我的看法和建议 我想说的是,对于很多的微小团队来说,可能都不是一定要上K8s,毕竟上K ...

  2. .NET遇上Docker - 使用Docker Compose组织Ngnix和.NETCore运行

    本文工具准备: Docker for Windows Visual Studio 2015 与 Visual Studio Tools for Docker 或 Visual Studio 2017 ...

  3. Docker(四):Docker 三剑客之 Docker Compose

    前两篇文章我们介绍了 Dockerfile 的使用Docker(二):Dockerfile 使用介绍,我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就 ...

  4. Docker 核心技术之Docker Compose

    Docker Compose 简介 Docker Compose是什么? Docker Compose是一个能一次性定义和管理多个Docker容器的工具. 详细地说: Compose中定义和启动的每一 ...

  5. Docker学习笔记之常用的 Docker Compose 配置项

    0x00 概述 与 Dockerfile 一样,编写 Docker Compose 的配置文件是掌握和使用好 Docker Compose 的前提.编写 Docker Compose 配置文件,其本质 ...

  6. Docker小白到实战之Docker Compose在手,一键足矣

    前言 Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说 ...

  7. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  8. 【原创】Docker容器及Spring Boot微服务应用

    Docker容器及Spring Boot微服务应用 1 什么是Docker 1.1 Docker的出现 问题一:项目实施环境复杂问题 传统项目实施过程中经常会出现“程序在我这跑得好好的,在你那怎么就不 ...

  9. 使用 Spring Cloud 和 Docker 构建微服务架构

    如何使用Spring Boot.Spring Cloud.Docker和Netflix的一些开源工具来构建一个微服务架构. 本文通过使用Spring Boot.Spring Cloud和Docker构 ...

随机推荐

  1. 升级 package.json 内所有包的版本号

    安装 全局安装这个库 npm-check-updates,因为后续依靠它来实现更新 package.json 中包的版本号 yarn global add npm-check-updates 食用 看 ...

  2. 116_Power Pivot 先进先出原则库龄库存计算相关

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一背景 前面写过了一个关于进销存的案例,留一个话题就是先进先出的库存计算. 刚好有朋友提了相关这样的需求.先来看看效果. ...

  3. JNPF.java前后端分离框架,SpringBoot+SpringCloud开发微服务平台

    JNPF.java版本采用全新的前后端分离架构模式.前后端分离已成为互联网项目开发的业界标准开发方式,通过 nginx+tomcat 等方式有效的进行解耦合,并且前后端分离会为以后的大型分布式架构.弹 ...

  4. MVC - MVC的工作流程

    MVC 是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应 ...

  5. DevOps落地实践点滴和踩坑记录-(1)

    记录初衷 本人一直在从事企业内DevOps落地实践的工作,走了不少弯路,也努力在想办法解决面临的问题,期间也经历过不少人和事情,最近突然有想法把经历过的,不管好的不好的都记录下来,分享给和我一样的一线 ...

  6. Linux 装完后没有声音的解决办法

    备注:1)Ubuntu Desktop版本:16.042)Linux工作用户:root1. 临时方法在终端中执行命令:pulseaudio --start --log-target=syslog2. ...

  7. 一文搞懂Kafka的基本原理及使用

    Kafka的基本原理及使用 一.基本概念及原理 1.Kafka特点 Kafka 是一个分布式的流式平台,流式平台包括以下三个特点: 发布和订阅消息(流),类似于一个消息队列或企业消息系统 持久化收到的 ...

  8. jdk8对象集合转map集合

    package koukay.Controller.Controllers; import koukay.Portal.webservices.Entity.User; import com.fast ...

  9. rosbag遍历数据出错:(unicode error) 'utf-8' codec can't decode byte 0xcd in position 31: invalid continuation byte

    主题: 前言 针对ros系统记录的bag文件,可以使用python的rosbag包,按照不同起止时间和topic进行提取. 然而,有的topic可以使用rosbag读取,但是不能遍历,存在解码错误.原 ...

  10. 从0到1搭建一款Vue可配置视频播放器组件(Npm已发布)

    前言 话不多说,这篇文章主要讲述如何从0到1搭建一款适用于Vue.js的自定义配置视频播放器.我们平时在PC端网站上观看视频时,会看到有很多丰富样式的视频播放器,而我们自己写的video标签样式却是那 ...