django频道,如何设置redis docker容器ip为主机

h43kikqp  于 2021-06-09  发布在  Redis
关注(0)|答案(0)|浏览(326)

我正在努力学习下面的教程https://channels.readthedocs.io/en/latest/tutorial/part_2.htm
我使用dockercompose来运行django频道所需的redis服务器,而不是普通的docker命令。但是,我不确定如何在以下位置设置ip地址:

  1. CHANNEL_LAYERS = {
  2. 'default': {
  3. 'BACKEND': 'channels_redis.core.RedisChannelLayer',
  4. 'CONFIG': {
  5. "hosts": [('127.0.0.2', 6379)],
  6. },
  7. },
  8. }

到redis容器。
我的电脑里有以下内容 docker-compose.yml :

  1. redis:
  2. image: "redis:alpine"
  3. command: redis-server --requirepass letmein
  4. ports:
  5. - "6379:6379"
  6. volumes:
  7. - ./redis.conf:/usr/local/etc/redis/redis.conf
  8. environment:
  9. - REDIS_REPLICATION_MODE=master
  10. networks:
  11. node_net:
  12. ipv4_address: 127.0.0.2
  13. networks:
  14. node_net:
  15. ipam:
  16. driver: default
  17. config:
  18. - subnet: 127.0.0.0/16

当我尝试测试与以下对象的连接时:

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

我收到以下信息:

  1. Traceback (most recent call last):
  2. File "<console>", line 1, in <module>
  3. File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 120, in __call__
  4. return call_result.result()
  5. File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 425, in result
  6. return self.__get_result()
  7. File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
  8. raise self._exception
  9. File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 180, in main_wrap
  10. result = await self.awaitable(*args,**kwargs)
  11. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 299, in send
  12. async with self.connection(index) as connection:
  13. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 835, in __aenter__
  14. self.conn = await self.pool.pop()
  15. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 73, in pop
  16. conns.append(await aioredis.create_redis(**self.host, loop=loop))
  17. File "/usr/local/lib/python3.6/site-packages/aioredis/commands/__init__.py", line 175, in create_redis
  18. loop=loop)
  19. File "/usr/local/lib/python3.6/site-packages/aioredis/connection.py", line 113, in create_connection
  20. timeout)
  21. File "/usr/local/lib/python3.6/asyncio/tasks.py", line 339, in wait_for
  22. return (yield from fut)
  23. File "/usr/local/lib/python3.6/site-packages/aioredis/stream.py", line 24, in open_connection
  24. lambda: protocol, host, port,**kwds)
  25. File "/usr/local/lib/python3.6/asyncio/base_events.py", line 794, in create_connection
  26. raise exceptions[0]
  27. File "/usr/local/lib/python3.6/asyncio/base_events.py", line 781, in create_connection
  28. yield from self.sock_connect(sock, address)
  29. File "/usr/local/lib/python3.6/asyncio/selector_events.py", line 439, in sock_connect
  30. return (yield from fut)
  31. File "/usr/local/lib/python3.6/asyncio/selector_events.py", line 469, in _sock_connect_cb
  32. raise OSError(err, 'Connect call failed %s' % (address,))
  33. ConnectionRefusedError: [Errno 111] Connect call failed ('127.0.0.2', 6379)

我知道容器之间的ip地址名称空间是不同的,所以如何访问redis容器上的127.0.0.2:6379?
可在以下位置获得建议:docker[errno 111]connect call failed('127.0.0.1',6379)
建议改变 127.0.0.1:6379redis:6379 但这是相当含糊的,而且直接改变了它 settings.py 即:

  1. CHANNEL_LAYERS = {
  2. 'default': {
  3. 'BACKEND': 'channels_redis.core.RedisChannelLayer',
  4. 'CONFIG': {
  5. "hosts": [('redis', 6379)],
  6. },
  7. },
  8. }

结果:`

  1. Traceback (most recent call last):
  2. File "<console>", line 1, in <module>
  3. File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 120, in __call__
  4. return call_result.result()
  5. File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 425, in result
  6. return self.__get_result()
  7. File "/usr/local/lib/python3.6/concurrent/futures/_base.py", line 384, in __get_result
  8. raise self._exception
  9. File "/usr/local/lib/python3.6/site-packages/asgiref/sync.py", line 180, in main_wrap
  10. result = await self.awaitable(*args,**kwargs)
  11. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 299, in send
  12. async with self.connection(index) as connection:
  13. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 835, in __aenter__
  14. self.conn = await self.pool.pop()
  15. File "/usr/local/lib/python3.6/site-packages/channels_redis/core.py", line 73, in pop
  16. conns.append(await aioredis.create_redis(**self.host, loop=loop))
  17. File "/usr/local/lib/python3.6/site-packages/aioredis/commands/__init__.py", line 175, in create_redis
  18. loop=loop)
  19. File "/usr/local/lib/python3.6/site-packages/aioredis/connection.py", line 113, in create_connection
  20. timeout)
  21. File "/usr/local/lib/python3.6/asyncio/tasks.py", line 339, in wait_for
  22. return (yield from fut)
  23. File "/usr/local/lib/python3.6/site-packages/aioredis/stream.py", line 24, in open_connection
  24. lambda: protocol, host, port,**kwds)
  25. File "/usr/local/lib/python3.6/asyncio/base_events.py", line 750, in create_connection
  26. infos = f1.result()
  27. File "/usr/local/lib/python3.6/concurrent/futures/thread.py", line 56, in run
  28. result = self.fn(*self.args,**self.kwargs)
  29. File "/usr/local/lib/python3.6/socket.py", line 745, in getaddrinfo
  30. for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
  31. socket.gaierror: [Errno -2] Name or service not known`

所以我来了,请你帮忙,有什么建议,提前谢谢你:)

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题