Redis 拒绝通过 Docker Compose 连接到 Spring Boot
Posted
技术标签:
【中文标题】Redis 拒绝通过 Docker Compose 连接到 Spring Boot【英文标题】:Redis refuses connection to Spring Boot via Docker Compose 【发布时间】:2022-01-03 08:40:30 【问题描述】:我开发了一个spring boot应用,通过redis存储登录信息。我有以下 docker-compose.yml:
version: "3.9"
services:
web:
build: .
ports:
- "8082:8082"
links:
- redis
redis:
image: redis
container_name: redis
hostname: redis-db
ports:
- "6379:6379"
command: redis-server --port 6379 --bind 0.0.0.0 --protected-mode no
Dockerfile:
FROM openjdk:8-jre-alpine
VOLUME /tmp
COPY app.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java", "-jar", "app.jar"]
在 Spring Boot 应用程序中,我只是使用以下 application.properties 来设置 Redis 连接:
server.port = 8082
spring.redis.host=redis-db
spring.redis.port=6379
我通过 CrudRepository 和 QueryByExampleExecutor 访问存储库。每次我尝试访问数据时,都会出现以下错误:
sgartner-web-1 | 2021-11-25 01:22:53.600 ERROR 1 --- [nio-8082-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379] with root cause
sgartner-web-1 |
sgartner-web-1 | java.net.ConnectException: Connection refused
sgartner-web-1 | at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.8.0_212]
sgartner-web-1 | at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:717) ~[na:1.8.0_212]
sgartner-web-1 | at io.netty.channel.socket.nio.NiosocketChannel.doFinishConnect(NioSocketChannel.java:330) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:334) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:707) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) ~[netty-transport-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) ~[netty-common-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.69.Final.jar!/:4.1.69.Final]
sgartner-web-1 | at java.lang.Thread.run(Thread.java:748) [na:1.8.0_212]
我已经测试了应用程序“正常”的 redis 实例和应用程序。对我来说似乎很奇怪的是“无法连接到 localhost:6379]”,即使我没有尝试连接到 localhost。
在容器外运行应用程序时测试此行为表明,它可以识别更改的主机名并且不会尝试连接到 localhost...
指定的 redis 命令似乎也不是问题:通过使用相同命令在容器外部运行 redis 并尝试通过 VM 连接到它来对此进行测试。
我非常感谢您提供解决方案或其他可能的原因。感谢任何回复此问题的人!
【问题讨论】:
你能告诉我们你的 Dockerfile 吗?你只有这个application.properties
文件吗?
【参考方案1】:
根据日志,它清楚地表明 Web 应用程序无法连接到 redis 端口 6379。您可以尝试在 Dockerfile 中公开 6379 吗? ,请先检查您是否可以从本地机器上提取 6379。好像是网络问题。
看看这有帮助吗。
Docker can't connect to redis from another service
【讨论】:
以上是关于Redis 拒绝通过 Docker Compose 连接到 Spring Boot的主要内容,如果未能解决你的问题,请参考以下文章
手写redis的docker文件,通过docker-compose配置redis
通过 docker-compose 快速部署 Redis 保姆级教程
节点无法通过 Docker Compose 连接到 Redis
docker-compose 中的 MySQL -- 访问被拒绝