我有一个用于运行芹菜的 Docker 实例,它是这样构建的:
docker build -t <me>/celery-imagemagick -f docker/celeryDockerFile .
然后我像这样运行它:
docker run --env-file ./docker/env --rm spaceofmotion/celery-imagemagick
.
env 文件中有一些配置,包括针对本地redis-server
的代理 URL。
CELERY_BROKER_URL=redis://192.168.86.23:6379/0
CELERY_RESULT_BACKEND=redis://192.168.86.23:6379/0
以上内容现已设置为本地测试。它进入芹菜启动并四处寻找 redis 的状态,只是无法连接并出现以下错误:
consumer: Cannot connect to redis://192.168.86.23:6379/0: Error 111 connecting to 192.168.86.23:6379. Connection refused..
如果我将 IP 地址更改为本地主机,那么可以预见的是它找不到服务器。但是,如果我只是在没有 Docker 的情况下通过执行 celery worker -A path.to.celery --loglevel=info
在本地运行所有这些,那么一切都可以正常工作 np。
我做错了什么?
Docker 容器不会在主机网络 (192.168.x.x( 上运行。如果你使用的是 Linux 计算机,则可以使用 Docker 主机网络。
在这种情况下,您还可以添加端口映射。试试这个:
docker run -p 192.168.86.23:6379:6379 ...
这会将本地 Redis 端口映射到 Celery 容器中的localhost:6379
。 https://docs.docker.com/config/containers/container-networking/#published-ports 还有更多。
这是一个较老的问题,但以下解决方案对我有用:
redis:
image: redis:6.2-alpine
networks:
- djangonetwork
celery:
networks:
- djangonetwork
restart: always
build:
context: .
将 Redis、Celery 和 Django 与 Celery URL 放在同一个网络中:
CELERY_BROKER_URL = 'redis://redis:6379/0'
CELERY_RESULT_BACKEND = "redis://redis:6379/0"