Docker 容器无法连接到 Redis

Posted

技术标签:

【中文标题】Docker 容器无法连接到 Redis【英文标题】:Docker container can't connect to Redis 【发布时间】:2022-01-07 12:28:29 【问题描述】:

我有一个 Docker 容器运行一个使用hiredis 的C 应用程序,它应该将数据写入一个暴露在默认地址和端口的Redis 服务器,该服务器在127.0.0.1:6379 的同一Linux 设备上本地运行。

Redis 服务器在不同的 Docker 容器中运行。我启动这个容器运行,暴露端口 6379 如下:sudo docker run --name redis_container -d -p 6379:6379 40c68ed3a4d2

redsi-cli 可以毫无问题地通过 127.0.0.1:6379 连接到此。

但是,无论我尝试什么,我应该写入 Redis 的容器总是从 C 代码中收到 Redis connection denied 错误。这是我最后一次尝试运行容器:sudo docker run --expose=6379 -i 7340dfee8ea5

我到底错过了什么?谢谢

【问题讨论】:

【参考方案1】:

C 客户端在容器内运行,这意味着127.0.0.1 指向容器本身,而不是您的主机。您应该将 redis 客户端配置为 redis_container:6379,因为这是您在 docker 运行 redis 容器时使用的名称。更多关于这个here

此外,两个容器需要在同一个 docker 网络中。使用以下命令创建一个简单的网络

docker network create my-net

并将--network my-net 添加到两个 docker run 命令(redis 客户端和 redis 服务器)

你可以阅读更多关于 docker network here

【讨论】:

感谢您的回复。我绝对是 Docker 的菜鸟。但是,我仍然不明白您所说的“您应该将 redis 客户端配置为 redis_container:6379 因为这是您在 docker 运行 redis 容器时使用的名称”是什么意思。你是说这是我应该叫它的名字,而不是 Docker 生成一个标识符,只是为了增加意义?我仍然正确使用 -p 6379:6379 选项来公开端口吗?那么当docker网络建立时,我的c容器必须写入哪个地址呢?谢谢。 --name 有两个目的。识别一个正在运行的容器,提供比一堆数字/人类可读的更多上下文。它还以某种方式充当 dns,允许同一 docker 网络中的其他网络服务使用该 dns 名称找到您正在运行的容器,因为您事先不知道您的容器将获得哪个 ip。 Redis 客户端(一般的客户端)需要你的 Redis 服务器的 ip/dns 和端口。所以配置客户端指向redis容器名(dns)和你配置的端口。

以上是关于Docker 容器无法连接到 Redis的主要内容,如果未能解决你的问题,请参考以下文章

无法从 docker 容器内的 Spring Boot 连接到 Redis

Docker:Springboot 容器无法连接到 PostgreSql 容器连接错误

Mariadb docker容器无法使用Python连接到主机上的MySQL服务器(111连接被拒绝)

在 Docker 容器中运行 .Net 5 API 时无法连接到 Postgres

docker wordpress 容器无法连接到数据库容器

Spring Boot 应用程序无法连接到 Docker 中的 Redis 副本