我正在将使用Django Channels用于websocket功能的Web应用程序进行docker化。这取决于redis。我无法让应用程序的redis部分正常工作。我尝试坚持[C0]。
docker-compose.yml
version: "3"
services:
db:
image: mysql:latest
volumes:
- "./.mysql-data/db:/var/lib/mysql"
restart: always
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: database
MYSQL_USER: user
MYSQL_PASSWORD: password
networks:
- hostnetwork
backend:
build: ./backend
command: daphne -b 0.0.0.0 -p 8000 main.asgi:application
volumes:
- ./backend:/code
ports:
- "8000:8000"
depends_on:
- db
links:
- redis
redis:
image: "redis:alpine"
command: redis-server
ports:
- "6379:6379"
volumes:
- ./redis-data:/var/lib/redis <-- This dir doesn't exist on host machine
- ./redis.conf:/usr/local/etc/redis/redis.conf <-- I created this file manually on host machine
environment:
- REDIS_REPLICATION_MODE=master
networks:
node_net:
ipv4_address: 172.28.1.4
frontend:
build: ./frontend
ports:
- "3000:3000"
volumes:
- ./frontend:/usr/src/app
stdin_open: true
networks:
hostnetwork:
external: true
node_net:
ipam:
driver: default
config:
- subnet: 172.28.0.0/16
settings.py
使用以上配置,我的容器启动,并且redis最初不会出现任何错误,但是websocket使用者从未收到或发送任何消息。一分钟左右后,出现以下错误:
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [
(os.environ.get('REDIS_HOST', "172.28.1.4"),
os.environ.get('REDIS_PORT', 6379))
],
},
},
}
是什么原因导致backend_1 | File "/usr/local/lib/python3.8/asyncio/selector_events.py", line 494, in sock_connect
backend_1 | return await fut
backend_1 | File "/usr/local/lib/python3.8/asyncio/selector_events.py", line 526, in _sock_connect_cb
backend_1 | raise OSError(err, f'Connect call failed {address}')
backend_1 | TimeoutError: [Errno 110] Connect call failed ('172.28.1.4', 6379)
以及服务器和Redis之间显然缺乏通信?我如何让两个人说话?
此答案使我了解了解决问题所需的知识。我只是删除了:
TimeoutError
并将 networks:
node_net:
ipv4_address: 172.28.1.4
更改为此:
CHANNEL_LAYERS
我想这使我的服务可以通过CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [
(os.environ.get('REDIS_HOST', "redis"), <---
os.environ.get('REDIS_PORT', 6379))
],
},
},
}
创建的桥接网络进行通信。