集成测试运行后无法连接Docker部署的Redis服务器问题咨询
问题原因
- Docker Compose配置错误:你给Redis容器设置了
hostname: localhost,该配置会干扰容器内部的网络栈解析,部分场景下会导致Redis服务绑定异常。 - Redis持久化触发崩溃:Redis默认开启RDB自动持久化,你启动时的日志明确提示
overcommit_memory配置为0,当测试写入数据触发RDB保存时,需要fork子进程执行写入操作,内存不足时会导致fork失败,Redis进程直接崩溃退出。 - 无内存限制导致OOM:你没有给Redis设置最大内存限制,也没有给Docker容器配置内存上限,当测试写入大量数据时,Redis占用内存超出宿主机或Docker的阈值,会被系统的OOM Killer直接杀死,导致端口停止监听,出现连接拒绝报错。
- 测试逻辑存在误操作:部分集成测试的清理逻辑会调用
SHUTDOWN等Redis管理命令,直接关闭服务端进程,导致后续无法连接。
解决方案
1. 修正Docker Compose配置
替换你的Redis服务配置为以下内容,移除错误的hostname配置,关闭测试不需要的持久化,增加内存限制:
version: '3' services: redis: image: redis ports: - "6369:6379" container_name: redis-integration-test mem_limit: 512m command: redis-server --save "" --appendonly no --maxmemory 256mb --maxmemory-policy allkeys-lru
配置说明:
- 移除
hostname: localhost避免网络解析异常 mem_limit: 512m限制Docker容器最大可用内存为512M--save "" --appendonly no关闭RDB和AOF持久化,集成测试不需要数据落盘,也避免持久化触发的崩溃问题--maxmemory 256mb --maxmemory-policy allkeys-lru限制Redis最大内存为256M,内存满时优先淘汰最近最少使用的键,避免OOM
2. 修复宿主机系统配置
解决Redis启动时的overcommit_memory警告:
- 临时生效:执行
sudo sysctl vm.overcommit_memory=1 - 永久生效:将
vm.overcommit_memory = 1写入/etc/sysctl.conf文件,执行sudo sysctl -p使配置立即生效
3. 排查测试清理逻辑
检查你的集成测试是否存在调用Redis SHUTDOWN命令、或者向Redis发送退出信号的清理代码,移除这类误关服务端的逻辑。
4. 快速验证方法
执行完上述配置后,先启动容器,运行测试后执行docker ps查看Redis容器是否仍处于运行状态,如果还是退出,执行docker logs redis-integration-test --tail 100查看退出前的错误日志,进一步定位问题。
内容的提问来源于stack exchange,提问作者Peter B.
相关产品推荐
相关产品推荐

