芹菜工人无法连接到docker实例上的redis

11 python django celery docker docker-compose

我有一个运行Django应用程序的dockerized设置,我在其中使用Celery任务.Celery使用Redis作为经纪人.

版本:

  • Docker版本17.09.0-ce,构建afdb6d4
  • docker-compose版本1.15.0,build e12f3b9
  • Django的== 1.9.6
  • Django的芹菜拍== 1.0.1
  • 芹菜== 4.1.0
  • 芹菜[redis的]
  • Redis的== 2.10.5

问题:

我的芹菜工人似乎无法连接到位于localhost:6379的redis容器.我能够telnet到指定端口上的redis服务器.我能够验证redis-server是否在容器上运行.

当我手动连接到Celery docker实例并尝试使用该命令创建一个worker时,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...

笔记:

我能够telnet到端口6379上的redis容器.在redis容器上,redis-server正在运行.

还有什么我想念的吗?我已经离兔子洞很远了,但感觉我错过了一些非常简单的东西.

DOCKER CONFIG文件:

泊坞窗,compose.common.yml 这里
泊坞窗,compose.dev.yml 这里

blu*_*res 21

当您使用docker-compose时,您将不会使用localhost容器间通信,您将使用容器的compose-assigned主机名.在这种情况下,redis容器的主机名是redis.下面的顶级元素services:是您的默认主机名.

所以对于芹菜连接到redis,你应该尝试redis://redis:6379/0.由于协议和服务名称相同,我将详细说明:如果您在docker-compose中将redis服务命名为"butter-pecan-redis",则应使用redis://butter-pecan-redis:6379/0.

此外,docker-compose.dev.yml似乎没有芹菜和redis在公共网络上,这可能导致他们无法看到对方.我相信他们需要共享至少一个共同的网络才能解析各自的主机名.

docker-compose中的网络在第一个段落中有一个示例,其中有一个docker-compose.yml可供查看.