Celery工作人员无法连接到Docker实例上的Redis
我有一个运行Django应用程序的dockerized设置,在其中使用Celery任务。celery使用Redis作为经纪人。
- Docker版本17.09.0-CE,构建afdb6d4
- docker-compose版本1.15.0,构建e12f3b9
- 的Django = = 1.9.6
- django-celery-beat == 1.0.1
- celery== 4.1.0
- celery[redis]
- redis == 2.10.5
我的celery工人似乎无法连接到位于localhost:6379的redis容器。我可以在指定端口上远程登录到Redis服务器。我能够验证容器上的redis服务器正在运行。
当我手动连接到Celery docker实例并尝试使用命令创建工作线程时,celery -A backend worker -l info
我得到通知:
[2017-11-13 18:07:50,937: ERROR/MainProcess] consumer: Cannot connect to
redis://localhost:6379/0: Error 99 connecting to localhost:6379. Cannot assign
requested address.. Trying again in 4.00 seconds...
我能够远程登录到端口6379上的redis容器。在redis容器上,redis-server正在运行。
还有什么我想念的吗?我已经走得很远了,但感觉好像我错过了一些非常简单的事情。
泊坞窗,compose.common.yml 这里
泊坞窗,compose.dev.yml 这里
回答:
当您使用docker-
compose时,您将不会localhost
用于容器间通信,而将使用容器的由compose分配的主机名。在这种情况下,您的redis容器的主机名是redis
。下面的顶级元素services:
是您的默认主机名。
因此,要使Celery连接到Redis,您应该尝试redis://redis:6379/0
。由于协议和服务名称相同,因此我将详细说明:如果您在docker-
compose中将redis服务命名为“ butter-pecan-redis”,则应使用redis://butter-pecan-
redis:6379/0。
另外,docker-
compose.dev.yml在公共网络上似乎没有Celery和红豆,这可能会导致它们彼此看不见。我相信他们需要共享至少一个公共网络才能解析各自的主机名。
docker-
compose中的网络在前几段中都有一个示例,其中包含docker-
compose.yml。
以上是 Celery工作人员无法连接到Docker实例上的Redis 的全部内容, 来源链接: utcz.com/qa/419501.html