Celery工作人员无法连接到docker实例上的redis



我有一个码头化的设置,运行一个Django应用程序,在其中我使用Celery任务。Celery使用Redis作为代理。

版本控制:

  • Docker 17.09.0-ce版本,构建afdb6d4
  • docker compose 1.15.0版本,构建e12f3b9
  • Django==1.9.6
  • django芹菜节拍==1.0.1
  • 芹菜==4.1.0
  • 芹菜
  • redis==2.10.5

问题:

我的芹菜工作人员似乎无法连接到位于localhost:6379的redis容器。我可以在指定的端口上telnet到redis服务器。我可以验证redis服务器是否在容器上运行。

当我手动连接到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服务器正在运行。

我还缺少什么吗?我已经陷入了困境,但我觉得我错过了一些非常简单的事情。

DOCKER CONFIG FILES:

docker-compose.common.yml此处
docker-compase.dev.yml此处

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

因此,对于连接到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。

您可能需要将链接和dependens_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

然后用将url配置为redis、postgres、memcached等

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

对我来说,问题是所有的容器,包括芹菜,都指定了一个网络参数。如果是这种情况,则redis容器也必须具有相同的参数,否则将出现此错误。见下文,修复程序添加了"网络":

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

相关内容

  • 没有找到相关文章

最新更新