Docker Compose部署Redis出现SYNC套接字连接拒绝错误及端口配置疑问
Docker Compose部署Redis出现SYNC套接字连接拒绝错误及端口配置疑问
兄弟,我来帮你拆解这两个问题,一步步解决你的困扰:
一、为什么用expose就能让API访问Redis,不用ports也可以?
首先得搞懂Docker里expose和ports的核心区别:
expose只是声明容器要暴露的端口,它的作用是告诉Docker这个容器会使用这个端口,同时在同一自定义网络(比如你的api_network)里的其他容器,可以直接通过容器名:端口(也就是redis:6379)访问这个服务。它不需要把端口映射到宿主机,只服务于Docker内部的容器通信。ports是把容器端口映射到宿主机端口,目的是让宿主机或者外部网络的机器能访问容器里的服务。
你的API和Redis都在api_network这个自定义网络里,所以只要Redis容器暴露了6379端口(不管是expose声明,还是容器本身的程序监听了这个端口),API容器就能直接通过redis:6379连接,完全不需要ports映射。
二、为什么加了ports后出现SYNC连接拒绝的错误?
从你贴的日志来看,问题根本不是ports本身导致的,而是你的Redis被远程执行了REPLICAOF 194.38.20.225:8886命令,让它变成了一个副本节点,试图连接这个外部主节点,但对方拒绝了连接,所以才会反复报错。
为什么加了ports后才出现?因为ports: -6379:6379把Redis的端口映射到了宿主机,外部网络的机器可以直接访问你的Redis了——而你的Redis没有设置密码验证,导致有人(或者某个误操作的程序)远程连接进来,执行了副本配置命令。
解决办法:
立即恢复Redis为主节点:
进入Redis容器执行命令,让它停止尝试连接外部主节点:docker exec -it 你的redis容器名 redis-cli replicaof no one(如果是旧版本Redis,用
slaveof no one)限制Redis的访问权限:
- 如果不需要外部访问Redis:直接去掉
ports配置,只用expose,这样只有同一网络的API容器能访问Redis,外部连不上,从根源避免恶意操作。 - 如果确实需要外部访问:必须给Redis设置密码,修改你的
redis.conf,添加一行:
同时在API的配置里加上Redis密码,确保连接时验证身份,防止未授权的命令执行。requirepass your_strong_complex_password
- 如果不需要外部访问Redis:直接去掉
排查是否有程序误操作:
检查你的API代码或者其他关联服务,有没有不小心发送了REPLICAOF相关命令到Redis,排除内部代码导致的问题。
备注:内容来源于stack exchange,提问作者Dyslexia S
相关产品推荐
相关产品推荐

