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

时间:2017-11-13 19:29:48

标签: python django docker docker-compose celery

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

版本:

  • Docker版本17.09.0-ce,build 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实例并尝试使用命令celery -A backend worker -l info创建一个worker时,我收到通知:

[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 FILES:

docker-compose.common.yml here
docker-compose.dev.yml here

3 个答案:

答案 0 :(得分:15)

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

因此,要将芹菜连接到redis,您应该尝试redis://redis:6379/0。由于协议和服务名称是相同的,我将详细说明:如果您将redis服务命名为" butter-pecan-redis"在您的docker-compose中,您将使用redis://butter-pecan-redis:6379/0

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

Networking in docker-compose在第一个段落中有一个示例,其中有一个docker-compose.yml可供查看。

答案 1 :(得分:2)

您可能需要将linkdepends_on部分添加到docker compose文件中,然后按主机名引用容器。

更新了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

然后使用以下命令将网址配置为redis,postgres,memcached等。

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

答案 2 :(得分:0)

对我来说,问题是所有容器(包括芹菜)都指定了网络参数。如果是这种情况,那么redis容器也必须具有相同的参数,否则您将收到此错误。如下所示,此修复程序添加了“网络”:

  redis:
    image: redis:alpine
    ports:
      - '6379:6379'
    networks:
      - server