我正在开发一个使用 Redis 的 Spring Boot 项目。我能够在单独的 Docker 容器中运行它,并且运行良好。但是,将 Spring Boot 应用程序、Redis 和 MariaDB 添加到
docker-compose.yml
文件并运行后,所有容器都成功启动。问题是,当我进行基于 Redis 的 API 调用时,我收到以下错误:
org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
查看日志后,发现以下记录:
io.lettuce.core.RedisClient : Resolved SocketAddress localhost/<unresolved>:6379 using redis://localhost
io.lettuce.core.AbstractRedisClient : Connecting to Redis at localhost/<unresolved>:6379
这表明即使我在
docker-compose.yml
和 application.properties
中将主机名指定为“redis”并指定相关端口,应用程序仍在尝试连接到本地主机 API。
你能帮忙吗?
docker-compose.yml
version: "3.8"
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
volumes:
- .:/app
- ~/.m2:/root/.m2
environment:
- MAVEN_OPTS=-Xmx512m
- SPRING_DATASOURCE_URL=my_db_url?useSSL=false
- SPRING_DATASOURCE_USERNAME=my_user
- SPRING_DATASOURCE_PASSWORD=my_pass
- SPRING_REDIS_HOST=redis
- SPRING_REDIS_PORT=6379
depends_on:
- redis
- mariadb
networks:
- app-network
redis:
image: redis:latest
ports:
- "6379:6379"
volumes:
- ./redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
networks:
- app-network
mariadb:
image: mariadb:latest
environment:
- MYSQL_ROOT_PASSWORD=my_pass
- MYSQL_DATABASE=my_db
ports:
- "3306:3306"
volumes:
- mariadb_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
mariadb_data:
application.properties
spring.redis.host=redis
spring.redis.port=6379
我还创建了一个
redis.conf
文件。
bind 0.0.0.0
protected-mode no
日志表明您的应用程序正在连接到
localhost
而不是 Redis 主机。请检查您的 Java 代码,确保它从配置属性中正确读取 Redis 主机。要验证这一点,您可以通过 Docker 中的环境变量传递 Redis 主机。此外,请确保在运行应用程序时使用正确的应用程序属性配置文件。