【问题标题】:jedis unable to connect to redis docker instance - Connection refused (Connection refused) [duplicate]绝地武士无法连接到redis docker实例-连接被拒绝(连接被拒绝)[重复]
【发布时间】:2021-09-18 17:37:36
【问题描述】:

按照 url link 中的建议在本地运行 redis docker 映像 从日志中可以看出运行良好

docker pull redis
docker run --name some-redis -d redis

然后docker启动。我可以看到如下日志

docker logs --follow some-redis
1:C 08 Jul 2021 07:17:51.243 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 08 Jul 2021 07:17:51.243 # Redis version=6.2.4, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 08 Jul 2021 07:17:51.243 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 08 Jul 2021 07:17:51.244 * monotonic clock: POSIX clock_gettime
1:M 08 Jul 2021 07:17:51.247 * Running mode=standalone, port=6379.
1:M 08 Jul 2021 07:17:51.248 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 08 Jul 2021 07:17:51.248 # Server initialized
1:M 08 Jul 2021 07:17:51.250 * Ready to accept connections

我正在使用 jedis 连接到这个 redis 容器,这里的代码和 redis docker 都在本地机器上。下面的代码不在容器上,而是在本地主机上。 redis已经暴露了6379端口redis dockerfile link

public static void main(String [] args) {
    System.out.println("connecting");
    Jedis jedis;
    jedis = new Jedis("localhost",6379);
    System.out.println("connected and pinging now");
    //jedis.ping();
    jedis.set("events/city/rome", "32,15,223,828");  //line 274
    String cachedResponse = jedis.get("events/city/rome");
    System.out.println("ping done");
}

连接出错

    connecting
connected and pinging now
Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused (Connection refused)
    at redis.clients.jedis.Connection.connect(Connection.java:164)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:100)
    at redis.clients.jedis.BinaryClient.set(BinaryClient.java:97)
    at redis.clients.jedis.Client.set(Client.java:32)
    at redis.clients.jedis.Jedis.set(Jedis.java:68)
    at com.org.app.module.TaskPerformer.main(TaskPerformer.java:274)
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:606)
    at redis.clients.jedis.Connection.connect(Connection.java:158)
    ... 6 more

jedis.ping() 的第 273 行也出现此错误

【问题讨论】:

  • 你的 java 应用程序和 redis 容器化了吗(最终由 docker-compose 实现)?如果是这样,它们必须在同一网络上才能相互联系。如果您尝试从主机访问容器化的 redis,您还需要公开 redis 端口才能访问它。在这些情况下,发布您的 docker/docker-compose 设置对于能够帮助您的人们总是有用的。
  • @nitrin0: docker 和 java 都是本地的...并且 6379 已经暴露在 redis docker 镜像 github.com/docker-library/redis/blob/…
  • 您是否可以使用 redis-cli(或 telnet/whatever)连接到您的 redis 实例?如果不查找防火墙问题,并在 redis.conf 中查找 protected-mode(应设置为“no”)和 bind(如果还没有,请评论它)等设置。
  • 您能否编辑问题以包含有关您如何启动此设置的详细信息?您正在使用的docker run 命令是什么?客户端应用程序是否在容器中,它是否与 Redis 位于同一主机上?如果应用程序位于主机上的容器之外,您是否从 Redis 容器发布端口?
  • 您需要一个docker run -p 选项来将容器端口发布到主机端口(从非容器应用程序的角度来创建localhost:6379)。 Dockerfile EXPOSE 设置本身并不能做到这一点,并且“暴露”作为动词在 Docker 中意义不大。

标签: java docker redis jedis


【解决方案1】:

您应该通过明确提及端口或使用主机网络将 Redis 端口 (TCP 6379) 发布到主机系统。

这里是如何只发布 TCP 端口 6379(推荐的解决方案):

docker run --rm -p 6379:6379 redis

以下是使用网络主机的方法(这对于您的简单案例来说似乎有点过头了,并且可能会面临进一步的安全风险):

docker run --rm --network host redis

【讨论】:

    猜你喜欢
    • 2017-07-10
    • 2016-02-14
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2019-01-22
    • 2021-01-24
    • 2015-07-27
    相关资源
    最近更新 更多