【问题标题】:Docker container can't connect to RedisDocker 容器无法连接到 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

我到底错过了什么?谢谢

【问题讨论】:

    标签: c linux docker redis hiredis


    【解决方案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)和你配置的端口。