Docker [Errno 111] Не удалось установить соединение («127.0.0.1», 6379) - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь следовать руководству здесь https://channels.readthedocs.io/en/latest/tutorial/part_2.html и проверить, может ли канальный уровень связываться с Redis. Единственное, что я делаю, это то, что я использую docker -композицию и запускаю всю вещь в 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

Есть идеи, что я могу сделать прямо сейчас? Я действительно новичок в этом

1 Ответ

3 голосов
/ 30 января 2020

Попробуйте изменить 127.0.0.1:6379 на redis:6379.

Хотя Redis работает, ваш контейнер python не может связаться с ним; это потому, что он пытается подключиться к 127.0.0.1:6379, но с точки зрения контейнера там ничего не работает. Это может быть немного неприятно для отладки, но это немного проще, если учесть, что контейнеры получают свое собственное пространство имен сети. В результате, python localhost! = redis localhost! = Ваш хост-компьютер localhost.

К счастью, легко подключить контейнеры, совместно использующие один и тот же мост, и по умолчанию docker-compose создает сеть с одним мостом и подключает к ним все ваши контейнеры, предоставляя необходимый DNS, чтобы они могли обнаруживать друг друга. В результате связь контейнер-контейнер работает просто с использованием имени службы.

Как примечание, можно запускать контейнеры в одном и том же пространстве имен и запускать их в пространстве имен хоста с помощью флага --net=container:<container-id> или --net=host. Это особенно полезно для запуска средств отладки в контейнере и присоединения их к сетевому пространству имен другого контейнера или хоста, например, используя netshoot до , чтобы посмотреть, какие порты прослушивают в контейнере (выставлено или нет), docker run --rm -it --net container:test_web_1 nicolaka/netshoot netstat -tulpn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...