从我今天的阅读中,在我发现的所有例子中,我都没有看到芹菜在一个与Django本身完全独立的容器中。Celery似乎有在同一个容器中,因为它遍历应用程序源文件并查找tasks.py以及初始的Celery.py。这是正确的还是我今天误读了?
例如。我熟悉使用dockercompose来旋转Django、Nginx、Postgres和存储容器。我假设我将添加一个celery和rabbitmq容器,但我看不出如何将Django配置为使用远程celery服务器。
我对芹菜的了解还很早,我希望这不是我在其他地方忽视的。
谢谢,
-p
默认情况下,如果您使用Heroku,它会为django运行一个web Dyno来响应请求,为Celery运行另一个工作程序Dyno,每个Dyno都在一个单独的实例上运行。
两个Dynos都运行相同的代码,您的芹菜工作人员需要访问模型,并且管理/部署一个代码库很容易,但没有什么可以阻止您为每个实例使用不同的代码库,因为Django和celery之间的通信是用AMQP协议完成的,抛出一个类似Reddis的Broker。
在单个容器中运行所有进程更简单。但是,您可以在一个单独的容器中运行每个进程。他们将通过代理和结果后端相互通信。
下面是我的示例存储库,它使用Django、Celery、RabbitMQ和Redis。此外,Django还提供REST API(用于DRF的wsgi
服务器)和WebSockets(用于Django Channels的asgi
服务器)。每个进程都在单独的容器中运行,但它们有共同的代码库(都存储在单个存储库中)。
version: '2'
services:
nginx:
restart: always
image: nginx:1.12-alpine
ports:
- 8000:8000
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- static_volume:/app/backend/server/django_static
client:
build:
context: .
dockerfile: ./docker/client/Dockerfile
restart: always
ports:
- 5001:5000
expose:
- 5000
postgres:
restart: always
image: postgres:9.5.6-alpine
volumes:
- ./docker/postgres/data:/var/lib/postgresql
ports:
- 5433:5432
expose:
- 5432
environment:
FILLA_DB_USER: tasks_user
FILLA_DB_PASSWORD: tasks_password
FILLA_DB_DATABASE: simple_tasks
POSTGRES_USER: postgres
volumes:
- ./docker/postgres/init-user-db.sh:/docker-entrypoint-initdb.d/init-user-db.sh
redis:
image: redis:3.0-alpine
restart: unless-stopped
ports:
- 6378:6379
rabbitmq:
image: rabbitmq:3.7-alpine
restart: unless-stopped
wsgiserver:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/wsgi-entrypoint.sh
volumes:
- static_volume:/app/backend/server/django_static
links:
- postgres
- redis
- rabbitmq
expose:
- 8000
asgiserver:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/asgi-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
expose:
- 9000
worker:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/worker-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
redislistener:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/redis-listener-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
workerlistener:
extends:
file: docker-common.yml
service: backend
entrypoint: /app/docker/backend/worker-listener-entrypoint.sh
links:
- postgres
- redis
- rabbitmq
volumes:
static_volume: {}
对于小型项目,我会将所有流程保留在一个容器中,而对于需要扩展的大型项目,我则会使用多个容器。