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

我有一个dockerized安装程序运行一个Django应用程序,我在其中使用芹菜任务。 Celery使用Redis作为经纪人。

版本:

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

问题:

我的芹菜工人似乎无法连接到位于localhost的redis容器:6379。 我可以远程login指定端口上的redis服务器。 我能够validation在容器上运行的redis服务器。

当我手动连接到芹菜docker实例,并尝试使用命令celery -A backend worker -l info创build一个工人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...

笔记:

我能够远程login到端口6379上的redis容器。在redis容器上,redis-server正在运行。

还有什么我失踪? 我已经走了很远的兔子洞,但觉得我错过了一些非常简单的事情。

DOCKERconfiguration文件:

docker-compose.common.yml 在这里
docker-compose.dev.yml 在这里

当你使用docker-compose的时候,你不会使用localhost进行容器间通信,你将使用容器的组合分配主机名。 在这种情况下,redis容器的主机名是redisservices:下的顶级元素services:是您的默认主机名。

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

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

docker-compose中的networking在第一部分中有一个例子,用docker-compose.yml来看看。

您可能需要将链接和depends_on部分添加到您的泊坞窗撰写文件中,然后通过主机名引用容器。

更新了docker-compose.yml:

 version: '2.1' services: db: image: postgres memcached: image: memcached redis: image: redis ports: - '6379:6379' backend-base: build: context: . dockerfile: backend/Dockerfile-base image: "/backend:base" backend: build: context: . dockerfile: backend/Dockerfile image: "/backend:${ENV:-local}" command: ./wait-for-it.sh db:5432 -- gunicorn backend.wsgi:application -b 0.0.0.0:8000 -k gevent -w 3 ports: - 8000 links: - db - redis - memcached depends_on: - db - redis - memcached celery: image: "/backend:${ENV:-local}" command: ./wait-for-it.sh db:5432 -- celery worker -E -B --loglevel=INFO --concurrency=1 environment: C_FORCE_ROOT: "yes" links: - db - redis - memcached depends_on: - db - redis - memcached frontend-base: build: context: . dockerfile: frontend/Dockerfile-base args: NPM_REGISTRY: http://.view.build PACKAGE_INSTALLER: yarn image: "/frontend:base" links: - db - redis - memcached depends_on: - db - redis - memcached frontend: build: context: . dockerfile: frontend/Dockerfile image: "/frontend:${ENV:-local}" command: 'bash -c ''gulp''' working_dir: /app/user environment: PORT: 3000 links: - db - redis - memcached depends_on: - db - redis - memcached 

然后将urlconfiguration为redis,postgres,memcached等:

  • redis://redis:6379/0
  • postgres://user:pass@db:5432/database