Docker-compose集成Redis、Sidekiq到Rails出现SocketError如何解决?
问题排查与解决方案
下面是按出现概率从高到低排列的排查方案:
1. 检查锚点*common-settings的网络配置
你配置中的web服务继承了<<: *common-settings,但redis和sidekiq服务没有继承该配置,大概率是这里的问题:
- 如果
*common-settings中指定了自定义networks配置,那么web服务运行在自定义网络下,redis、sidekiq运行在compose默认网络下,网络隔离导致无法通信 - 修复方案:要么给
redis、sidekiq也加上和web一致的networks配置,要么删除*common-settings中的自定义网络配置,让所有服务都跑在默认网络下 - 额外检查:如果
*common-settings中配置了network_mode: host,那么web服务会使用宿主机网络,无法通过服务名redis访问其他容器,此时可以删除该配置,或者将sidekiq的redis地址改为redis://localhost:6379/12
2. 验证容器网络归属
执行以下命令确认三个服务是否在同一个网络下:
# 查看compose项目对应的网络,一般为「项目名_default」 docker network ls # 检查网络下的容器列表 docker network inspect <你的网络名>
如果web/sidekiq/redis有任意一个不在该网络下,补充对应服务的networks配置即可。
3. 检查Redis服务的监听配置
默认的Redis镜像会绑定0.0.0.0,但不排除有自定义配置的情况,进入Redis容器执行命令验证:
docker-compose exec redis redis-cli config get bind
如果返回值为127.0.0.1,说明Redis只允许容器内部访问,给redis服务补充启动命令即可:
redis: image: 'redis:5-alpine' command: redis-server --bind 0.0.0.0 ports: - '6379:6379' volumes: - 'redis:/data'
4. 检查Redis配置是否被覆盖
进入Web容器执行命令,确认Sidekiq实际生效的Redis配置:
docker-compose exec web rails c > Sidekiq.configuration.redis
如果返回的地址不是redis://redis:6379/12,排查是否有config/environments/development.rb等其他配置文件覆盖了Sidekiq的Redis配置。
5. 本地手动执行Sidekiq的特殊情况
如果你是在宿主机本地执行bundle exec sidekiq报的错,属于正常现象:宿主机没有redis域名的解析规则,要么将本地hosts文件添加127.0.0.1 redis映射,要么临时修改Redis地址为redis://localhost:6379/12即可。
内容的提问来源于stack exchange,提问作者kkp
相关产品推荐
相关产品推荐

