Docker \[Errno 111\] 连接调用失败('127.0.0.1',6379)

新手上路,请多包涵

我正在尝试按照此处的教程 https://channels.readthedocs.io/en/latest/tutorial/part_2.html 并检查通道层是否可以与 Redis 通信。我正在做的唯一不同的事情是我正在使用 docker-compose 并在 docker 容器上运行整个东西,这似乎把一切都搞砸了。这是我尝试时收到的错误消息

run async_to_sync(channel_layer.send)('test_channel', {'type': 'hello'})

 Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.7/site-packages/asgiref/sync.py", line 116, in __call__
    return call_result.result()
  File "/usr/local/lib/python3.7/concurrent/futures/_base.py", line 428, in result
    return self.__get_result()
  File "/usr/local/lib/python3.7/concurrent/futures/_base.py", line 384, in __get_result
    raise self._exception
  File "/usr/local/lib/python3.7/site-packages/asgiref/sync.py", line 156, in main_wrap
    result = await self.awaitable(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/channels_redis/core.py", line 293, in send
    async with self.connection(index) as connection:
  File "/usr/local/lib/python3.7/site-packages/channels_redis/core.py", line 820, in __aenter__
    self.conn = await self.pool.pop()
  File "/usr/local/lib/python3.7/site-packages/channels_redis/core.py", line 70, in pop
    conns.append(await aioredis.create_redis(**self.host, loop=loop))
  File "/usr/local/lib/python3.7/site-packages/aioredis/commands/__init__.py", line 175, in create_redis
    loop=loop)
  File "/usr/local/lib/python3.7/site-packages/aioredis/connection.py", line 113, in create_connection
    timeout)
  File "/usr/local/lib/python3.7/asyncio/tasks.py", line 414, in wait_for
    return await fut
  File "/usr/local/lib/python3.7/site-packages/aioredis/stream.py", line 24, in open_connection
    lambda: protocol, host, port, **kwds)
  File "/usr/local/lib/python3.7/asyncio/base_events.py", line 958, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.7/asyncio/base_events.py", line 945, in create_connection
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.7/asyncio/selector_events.py", line 473, in sock_connect
    return await fut
  File "/usr/local/lib/python3.7/asyncio/selector_events.py", line 503, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('127.0.0.1', 6379)

我检查了一些帖子,发现很多人认为这是因为 Redis 没有运行。我知道 Redis 存在,因为 docker ps 显示

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2ccab2cfc570        test_web            "python manage.py ru…"   7 minutes ago       Up 7 minutes        0.0.0.0:8000->8000/tcp   test_web_1
6da398f093fc        redis:2.8           "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes       0.0.0.0:6379->6379/tcp   relaxed_aryabhata

知道我现在能做什么吗?我对这些真的很陌生

原文由 Lucy Gu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

尝试将 127.0.0.1:6379 更改为 redis:6379

尽管 Redis 正在运行,但您的 python 容器无法与其通信;这是因为它正在尝试连接到 127.0.0.1:6379 ,但从容器的角度来看,那里没有任何运行。这在调试时可能有点令人沮丧,但如果您记住容器有自己的网络名称空间,就会容易一些。结果, python ’s localhost != redis ’s localhost != your host machine’s localhost

幸运的是,连接共享同一个网桥的容器很容易 ,默认情况下, docker-compose 创建一个单一的网桥网络 并将所有容器连接到它们,提供必要的 DNS 以允许它们发现彼此。因此,容器到容器的通信只需使用服务名称即可。

请注意,可以在同一命名空间中运行容器,并通过 --net=container:<container-id>--net=host 标志在主机的命名空间中运行它们。这对于在容器中运行调试工具并将它们附加到另一个容器或主机的网络命名空间特别有用,例如,使用 netshoot 查看容器内正在侦听哪些端口(暴露或未暴露), docker run --rm -it --net container:test_web_1 nicolaka/netshoot netstat -tulpn

原文由 Saites 发布,翻译遵循 CC BY-SA 4.0 许可协议

尝试将 127.0.0.1:6379 更改为 redis:6379。

这个对我有用。只是一些细节

docker-compose.yml

 ...
  redis:
    image: redis:latest
    ports:
      - "6379:6379"
    volumes:
      - 'redisdata:/data'
....
 CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('redis', 6379)],
        },
    },
}

原文由 Gerardo Perrucci 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题