【问题标题】:Docker [Errno 111] Connect call failed ('127.0.0.1', 6379)Docker [Errno 111] 连接调用失败('127.0.0.1',6379)
【发布时间】:2020-05-15 12:07:36
【问题描述】:

我正在尝试按照此处的教程进行操作 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

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

【问题讨论】:

    标签: python django docker redis


    【解决方案1】:

    尝试将 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)],
            },
        },
    }
    

    【讨论】:

      【解决方案2】:

      所以我被困在这个问题上,似乎没有一个答案对我有用。

      我发现 docker 会给容器自己的 IP 地址。在我使用的命令行中查找 IP 地址;

      'docker ps' 获取容器 ID。 'docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}} * container-id*' 这给了我 IP。

      这很有效;

      CHANNEL_LAYERS = {
          'default': {
              'BACKEND': 'channels_redis.core.RedisChannelLayer',
              'CONFIG': {
                  "hosts": [('172.20.0.1', 6379)],
              },
          },
      }
      

      【讨论】:

        【解决方案3】:

        我有同样的问题, 问题是我的python版本和频道。 本教程与 python=3.6、channels-redis 2.3.1 和 daphne 2.0.2、channels =2.0 完美结合。 您可以按照您已安装的频道版本的频道文档进行操作。

        【讨论】:

          【解决方案4】:
          docker run -p 6379:6379 -d redis:5
          

          然后启动服务器

          【讨论】:

            【解决方案5】:

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

            虽然 Redis 正在运行,但您的 python 容器无法与其通信;这是因为它试图连接到127.0.0.1:6379,但从容器的角度来看,那里没有运行任何东西。调试起来可能有点令人沮丧,但如果您记住容器有自己的网络命名空间,它会更容易一些。因此,python 的 localhost != redis 的 localhost != 你的主机的 localhost

            幸运的是,连接共享同一网桥和by default, docker-compose creates a single bridge network 的容器很容易,并将您的所有容器连接到它们,提供必要的 DNS 以允许它们相互发现。因此,容器到容器的通信只需使用服务名称即可。

            请注意,可以通过--net=container:&lt;container-id&gt;--net=host 标志在同一命名空间中运行容器,并在主机的命名空间中运行容器。这对于在容器中运行调试工具并将它们附加到另一个容器或主机的网络命名空间特别有用,例如在容器内使用netshootsee what ports are listening(暴露与否),docker run --rm -it --net container:test_web_1 nicolaka/netshoot netstat -tulpn

            【讨论】:

            • 嗨,我有一个问题,我究竟需要在哪里将127更改为redis?好像我更改了以下内容:'CONFIG': { "hosts": [('127.0.0.1', 6379)], }, 然后我得到 socket.gaierror: [Errno -3] 名称解析临时失败
            • @MareksNo 由于您的 DNS 出现故障,您可能使用的名称与您的服务名称不同。 docker network ls 显示当前网络,docker network inspect &lt;name&gt; 显示附加容器的名称。为了使 DNS 以您期望的方式工作,两个服务应该在同一个网络中,并按名称引用每个服务。还有其他网络细节,但这是使用 Docker 处理它的常用方法。
            猜你喜欢
            • 2020-09-14
            • 2021-06-25
            • 2023-03-18
            • 2017-05-16
            • 2020-08-27
            • 2017-07-06
            • 1970-01-01
            • 2019-11-28
            • 1970-01-01
            相关资源
            最近更新 更多