容器之间的 redis 连接被拒绝
redis connection refused between containers
我正在使用 docker 构建一个分为 3 个服务的小型应用程序我有一个节点服务器和一个 python 应用程序的 redisjson 服务。
我总是运行容器内的redis用于开发,在第一阶段我运行本机的python脚本和节点应用程序我只是用来连接到redis使用本地主机。
为了标准化和部署环境,我为每个服务设置了容器,但是当我尝试从其他容器连接到 redis 时,它拒绝连接。
下面是我的撰写文件,在复制意大利面时缩进可能会令人毛骨悚然,但愿不会。
我不得不将 redis 的端口从 6379 切换到 7000,因为它也给我带来了连接问题。
version: '3.7'
networks:
app-tier:
driver: bridge
services:
redis:
image: 'redislabs/rejson:latest'
command: ["redis-server", "--bind", "redis", "--port", "6379", "--requirepass", "password"]
environment:
- appendonly
ports:
- '7000:6379'
volumes:
- redis:/data
networks:
- app-tier
node:
build: ./tickingServer
environment:
TZ: Europe/Rome
depends_on:
- redis
# - mariadb
links:
- "redis"
# - "mariadb"
ports:
- 3000:3000
restart: always
networks:
- app-tier
wsdaemon:
build: ./socketServer
environment:
TZ: Europe/Rome
depends_on:
- redis
links:
- "redis"
volumes:
- ./logs:/usr/src/websocketdaemon/logs
ports:
- 8000:8000
restart: always
networks:
- app-tier
volumes:
redis:
在我的系统上,本机端口和 7000 都是免费的,现在它们正确地导致了 docker-代理的使用。
根据 docker 网络,我将 'redis' 用作连接的主机名,因为我是这样命名服务的。 python 连接测试片段如下:
import log
import configuration
import redis
config = configuration.configuration()
logger = log.Log().get_logger(
__name__, config['logFolder'], config['logFormat'])
redis_client = redis.Redis(host='redis', port=7000, db=0, password='password')
nodejs 连接器如下所示:
var Redis = require('ioredis');
var logger = require('../helpers/logHelper');
var JSONCache = require('redis-json');
let modName = "RedisConnector";
var redis = new Redis({
'host': 'redis',
'family': 4,
'db': 0,
'port': 7000,
'password': 'password'
});
我已经设法从 6379 端口而不是 7000 端口上的另一个容器连接到 redis,尽管在撰写文件中这样映射它。
我不得不加载一个 redis.conf 文件并且我不得不注释掉
bind 127.0.0.1
关闭保护模式
protected-mode no
我不得不从默认配置中手动删除所有格式错误的密钥。
现在,我 运行 在尝试使用 pubsub 从使用 rejson 库的 websocket python 实现传播频道更改时遇到了同样的问题。
当然,来自官方文档渠道的代码片段实际上不起作用。
我一直很后悔每天使用 redis 来保存和传播计数数据,我真的希望我永远不必再使用它
最终我解决了这个问题,将配置文件重构为以下设置:
loadmodule /usr/lib/redis/modules/rejson.so
protected-mode no
port 6379
timeout 0
tcp-keepalive 300
loglevel notice
logfile ""
databases 4
always-show-logo yes
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
appendonly yes
appendfilename "appendonly.aof"
这仍然可能只是设置开发环境的一些存根和荒谬的工作量。
docker-compose 文件中的服务定义现在如下所示。
redis:
image: 'redislabs/rejson:latest'
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--bind", "redis", "--port", "6379", "--requirepass", "password", "--appendonly", "yes"]
ports:
- '7000:6379'
volumes:
- redis:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- app-tier
volumes:
redis:
我正在使用 docker 构建一个分为 3 个服务的小型应用程序我有一个节点服务器和一个 python 应用程序的 redisjson 服务。
我总是运行容器内的redis用于开发,在第一阶段我运行本机的python脚本和节点应用程序我只是用来连接到redis使用本地主机。
为了标准化和部署环境,我为每个服务设置了容器,但是当我尝试从其他容器连接到 redis 时,它拒绝连接。 下面是我的撰写文件,在复制意大利面时缩进可能会令人毛骨悚然,但愿不会。 我不得不将 redis 的端口从 6379 切换到 7000,因为它也给我带来了连接问题。
version: '3.7'
networks:
app-tier:
driver: bridge
services:
redis:
image: 'redislabs/rejson:latest'
command: ["redis-server", "--bind", "redis", "--port", "6379", "--requirepass", "password"]
environment:
- appendonly
ports:
- '7000:6379'
volumes:
- redis:/data
networks:
- app-tier
node:
build: ./tickingServer
environment:
TZ: Europe/Rome
depends_on:
- redis
# - mariadb
links:
- "redis"
# - "mariadb"
ports:
- 3000:3000
restart: always
networks:
- app-tier
wsdaemon:
build: ./socketServer
environment:
TZ: Europe/Rome
depends_on:
- redis
links:
- "redis"
volumes:
- ./logs:/usr/src/websocketdaemon/logs
ports:
- 8000:8000
restart: always
networks:
- app-tier
volumes:
redis:
在我的系统上,本机端口和 7000 都是免费的,现在它们正确地导致了 docker-代理的使用。 根据 docker 网络,我将 'redis' 用作连接的主机名,因为我是这样命名服务的。 python 连接测试片段如下:
import log
import configuration
import redis
config = configuration.configuration()
logger = log.Log().get_logger(
__name__, config['logFolder'], config['logFormat'])
redis_client = redis.Redis(host='redis', port=7000, db=0, password='password')
nodejs 连接器如下所示:
var Redis = require('ioredis');
var logger = require('../helpers/logHelper');
var JSONCache = require('redis-json');
let modName = "RedisConnector";
var redis = new Redis({
'host': 'redis',
'family': 4,
'db': 0,
'port': 7000,
'password': 'password'
});
我已经设法从 6379 端口而不是 7000 端口上的另一个容器连接到 redis,尽管在撰写文件中这样映射它。
我不得不加载一个 redis.conf 文件并且我不得不注释掉
bind 127.0.0.1
关闭保护模式
protected-mode no
我不得不从默认配置中手动删除所有格式错误的密钥。
现在,我 运行 在尝试使用 pubsub 从使用 rejson 库的 websocket python 实现传播频道更改时遇到了同样的问题。
当然,来自官方文档渠道的代码片段实际上不起作用。 我一直很后悔每天使用 redis 来保存和传播计数数据,我真的希望我永远不必再使用它
最终我解决了这个问题,将配置文件重构为以下设置:
loadmodule /usr/lib/redis/modules/rejson.so
protected-mode no
port 6379
timeout 0
tcp-keepalive 300
loglevel notice
logfile ""
databases 4
always-show-logo yes
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
appendonly yes
appendfilename "appendonly.aof"
这仍然可能只是设置开发环境的一些存根和荒谬的工作量。
docker-compose 文件中的服务定义现在如下所示。
redis:
image: 'redislabs/rejson:latest'
command: ["redis-server", "/usr/local/etc/redis/redis.conf", "--bind", "redis", "--port", "6379", "--requirepass", "password", "--appendonly", "yes"]
ports:
- '7000:6379'
volumes:
- redis:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
networks:
- app-tier
volumes:
redis: