Luc*_* Gu 5 python django redis docker
我正在尝试按照这里的教程 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)
Run Code Online (Sandbox Code Playgroud)
我检查了一些帖子,看到很多人认为这是因为 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
Run Code Online (Sandbox Code Playgroud)
知道我现在可以做什么吗?我对这些真的很陌生
Sai*_*tes 13
尝试更改127.0.0.1:6379
为redis:6379
.
尽管 Redis 正在运行,但您的python
容器无法与其通信;这是因为它正在尝试连接到127.0.0.1:6379
,但从容器的角度来看,那里没有任何东西在运行。这对调试来说可能有点令人沮丧,但如果您记住容器有自己的网络命名空间,那就更容易了。结果,python
's localhost != redis
's localhost != 你主机的localhost
.
幸运的是,连接共享同一网桥的容器很容易,默认情况下,docker-compose
创建一个网桥网络并将所有容器连接到它们,提供必要的 DNS 以允许它们发现彼此。因此,容器到容器的通信只需使用服务名称即可。
需要注意的是,可以通过--net=container:<container-id>
or--net=host
标志在相同的命名空间中运行容器,并在主机的命名空间中运行容器。这是在一个容器中运行的调试工具,并将它们连接至其他容器或主机的网络命名空间,例如使用特别有用netshoot来看看有什么端口监听容器(便于暴露或不能)内docker run --rm -it --net container:test_web_1 nicolaka/netshoot netstat -tulpn
。
小智 6
尝试将 127.0.0.1:6379 更改为 redis:6379。
这个对我有用。只是一些细节
docker-compose.yml
...
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- 'redisdata:/data'
....
Run Code Online (Sandbox Code Playgroud)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('redis', 6379)],
},
},
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10196 次 |
最近记录: |