从 Java(Spring Boot)或 Node.js 检查/连接到在 docker 中运行的 Redis

Posted

技术标签:

【中文标题】从 Java(Spring Boot)或 Node.js 检查/连接到在 docker 中运行的 Redis【英文标题】:Check/connect to Redis running within docker from Java(Spring Boot) or Node.js 【发布时间】:2017-01-18 08:54:19 【问题描述】:

我在 Windows PC 上快速开始使用 Redis

docker run -p 6379:6379 redis

(Redis没有Windows发行版,fork for Windows不是最新版)

1:C 10 Sep 08:17:03.635 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.2.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

...
1:M 10 Sep 08:17:03.644 * The server is now ready to accept connections on port 6379

然后我无法从 Spring Boot 应用程序连接。跟application.properties一样

spring.redis.host=localhost
spring.redis.port=6379

出错了

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
    at redis.clients.jedis.Connection.connect(Connection.java:164) ~[jedis-2.8.2.jar:na]
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80) ~[jedis-2.8.2.jar:na]
    at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1677) ~[jedis-2.8.2.jar:na]
    at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87) ~[jedis-2.8.2.jar:na]
    at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868) ~[commons-pool2-2.4.2.jar:2.4.2]
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435) ~[commons-pool2-2.4.2.jar:2.4.2]
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) ~[commons-pool2-2.4.2.jar:2.4.2]
    at redis.clients.util.Pool.getResource(Pool.java:49) ~[jedis-2.8.2.jar:na]
    ... 23 common frames omitted
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_45]
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:1.8.0_45]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) ~[na:1.8.0_45]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_45]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_45]
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) ~[na:1.8.0_45]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_45]
    at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_45]
    at redis.clients.jedis.Connection.connect(Connection.java:158) ~[jedis-2.8.2.jar:na]
    ... 30 common frames omitted

当尝试将 Node.js 与 node_redis 示例一起使用时, 我得到了

Error Error: Redis connection to 127.0.0.1:6379 failed - connect ECONNREFUSED

【问题讨论】:

redis.io/topics/security 从 3.2 开始提到 protected mode。虽然我希望公共 docker 映像应该具有使 redis 准备好使用的配置 所以你能够让它工作? 没有。当我找到克服的,我会添加一个答案。 【参考方案1】:

今天遇到了类似的问题。 为JedisConnectionFactory 使用redis 容器的IP 地址为我解决了这个问题。

Docker 命令:

docker inspect --format ' .NetworkSettings.IPAddress ' some-redis-instance

【讨论】:

【参考方案2】:

正如你提到的(在 cmets 中),redis 将他们的图像与protected-mode 设置为yes (see here) 捆绑在一起。

如何绕过保护模式

1) 通过从服务器正在运行的同一主机连接到 Redis,禁用从环回接口发送命令“CONFIG SET protected-mode no”的保护模式,但是如果这样做,请确保 Redis 不能从 Internet 公开访问.使用 CONFIG REWRITE 使此更改永久生效。 2) 或者,您可以通过编辑 Redis 配置文件并将保护模式选项设置为“否”来禁用保护模式,然后重新启动服务器。 3) 如果您手动启动了服务器(可能是为了测试),请使用“--protected-mode no”选项重新启动它。 4) 设置绑定地址或认证密码。

来源:redis-github

建立自己的形象

您可以通过拉取redis 并将您自己的redis.conf 添加到图像中来创建自己的图像吗? 或者更新 Dockerfile 中的启动命令来禁用保护模式:CMD [ "redis-server", "--protected-mode", "no" ]

您还可以查看包含上述修改建议的 Dockerfile (最后一行):https://github.com/docker-library/redis/blob/23b10607ef1810379d16664bcdb43723aa007266/3.2/Dockerfile

此 Dockerfile 在Redis issue on github 中提供,它将启动命令替换为CMD [ "redis-server", "--protected-mode", "no" ]。 你可以下载这个 Dockerfile 并输入:

$ docker build -t redis-unprotected:latest .
$ docker run -p 6379:6379 redis-unprotected

【讨论】:

谢谢,看来是对的。我添加了github.com/docker-library/redis/issues/74【参考方案3】:

感谢 Alex 在https://github.com/docker-library/redis/issues/74 中的回答和评论 我能够使用完整的 IP 192.168.99.100:6379 连接到 Redis

请注意,最新的 3.2 映像已禁用保护模式 https://github.com/docker-library/redis/issues/75

【讨论】:

以上是关于从 Java(Spring Boot)或 Node.js 检查/连接到在 docker 中运行的 Redis的主要内容,如果未能解决你的问题,请参考以下文章

sh Git + Java + Spring Boot + Kotlin + Python + Node.js + Docker + Docker的安装脚本构建开发环境。

spring boot——ajax跨域

在 Spring Boot 中使用 dotenv 文件

JSF 注释不适用于 Spring-boot

宝塔面板部署Spring Boot项目

从 eclipse+gradle 运行时 Spring Boot 错误加载测试配置