【问题标题】:TimeoutError: [Errno 110] Connect call failed when trying to connect to redis service in dockerTimeoutError: [Errno 110] 尝试连接 docker 中的 redis 服务时连接调用失败
【发布时间】:2020-06-07 00:11:42
【问题描述】:

我正在 dockerizing 一个使用 Django Channels 实现 websocket 功能的 web 应用程序。这取决于redis。我无法让应用程序的 redis 部分正常工作。我试着坚持this redis/compose guide

docker-compose.yml

version: "3"

services:
  db:
    image: mysql:latest
    volumes:
      - "./.mysql-data/db:/var/lib/mysql"
    restart: always
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    networks:
      - hostnetwork
  backend:
    build: ./backend
    command: daphne -b 0.0.0.0 -p 8000 main.asgi:application
    volumes:
      - ./backend:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    links:
      - redis
  redis:
    image: "redis:alpine"
    command: redis-server
    ports:
      - "6379:6379"
    volumes:
      - ./redis-data:/var/lib/redis <-- This dir doesn't exist on host machine
      - ./redis.conf:/usr/local/etc/redis/redis.conf <-- I created this file manually on host machine
    environment:
      - REDIS_REPLICATION_MODE=master
    networks:
      node_net:
        ipv4_address: 172.28.1.4
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    volumes:
      - ./frontend:/usr/src/app
    stdin_open: true

networks:
  hostnetwork:
    external: true
  node_net:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

settings.py

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [
                (os.environ.get('REDIS_HOST', "172.28.1.4"),
                 os.environ.get('REDIS_PORT', 6379))
            ],
        },
    },
}

通过上述配置,我的容器启动了,并且 redis 一开始并没有给出任何错误,但是 websocket 消费者永远不会收到或发送任何消息。大约一分钟后,它给出了以下错误:

backend_1   |   File "/usr/local/lib/python3.8/asyncio/selector_events.py", line 494, in sock_connect
backend_1   |     return await fut
backend_1   |   File "/usr/local/lib/python3.8/asyncio/selector_events.py", line 526, in _sock_connect_cb
backend_1   |     raise OSError(err, f'Connect call failed {address}')
backend_1   | TimeoutError: [Errno 110] Connect call failed ('172.28.1.4', 6379)

是什么导致TimeoutError 以及我的服务器和redis 之间明显缺乏通信?我怎样才能让两个人说话?

【问题讨论】:

    标签: redis docker-compose port django-channels


    【解决方案1】:

    这个答案给了我解决问题所需的理解。我只是删除了:

        networks:
          node_net:
            ipv4_address: 172.28.1.4
    

    并将CHANNEL_LAYERS 更改为:

    CHANNEL_LAYERS = {
        "default": {
            "BACKEND": "channels_redis.core.RedisChannelLayer",
            "CONFIG": {
                "hosts": [
                    (os.environ.get('REDIS_HOST', "redis"), <---
                     os.environ.get('REDIS_PORT', 6379))
                ],
            },
        },
    }
    

    我想这允许我的服务通过docker-compose 创建的桥接网络进行通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2020-05-15
      • 2010-10-27
      • 2016-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多