我有一个码头化的设置,运行一个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容器的主机名是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。
您可能需要将链接和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