问题现象

使用 Docker 运行 Redis 和 RedisInsight 时,在 RedisInsight Web 界面添加数据库,填写 Host 为 127.0.0.1、端口 6379,报错:

Could not connect to 127.0.0.1:6379, please check the connection details.

根本原因

Docker 容器拥有独立的网络命名空间。

在 RedisInsight 容器内部,127.0.0.1 指向的是容器自身,而不是宿主机,更不是 Redis 容器。

因此,即使宿主机能通过 127.0.0.1:6379 访问 Redis,RedisInsight 容器内却访问不到。

解决方案(推荐)

让两个容器处于同一个 Docker 自定义网络中,并使用容器名称作为主机名进行通信。

操作步骤

创建网络(如已存在可跳过)

docker network create redis-network

启动 Redis 容器,加入该网络

docker run -d --name redis --network redis-network -p 6379:6379 redis

启动 RedisInsight 容器,加入同一网络

docker run -d --name redisinsight --network redis-network -p 5540:5540 redis/redisinsight

在 RedisInsight UI 中添加数据库时,填写:

  • Host:redis(即 Redis 容器的名称)
  • Port:6379
  • (如有密码,填写 Password)

✅ 此方法利用了 Docker 内置的 DNS 解析,容器名称会被自动解析为对应的容器 IP,且容器重启 IP 变化也不影响。

验证网络连通性的诊断命令

如果连接仍然失败,可用以下命令排查:

1. 检查容器是否在同一网络

docker network inspect redis-network

查看 Containers 部分,确认两个容器都在。

2. 测试 DNS 解析

docker exec -it redisinsight nslookup redis

应返回 Redis 容器的 IP。

3. 测试端口连通性

docker exec -it redisinsight sh -c "echo quit | nc -v redis 6379"

若返回 Connected 或 +OK,则网络通畅。

4. 直接使用 redis-cli 测试

docker exec -it redisinsight redis-cli -h redis -p 6379 ping

返回 PONG 表示连接成功。

其他可能失败的原因

  • Redis 绑定地址限制:检查 Redis 是否配置了 bind 127.0.0.1,若是则需改为 bind 0.0.0.0 或删除该配置(官方镜像默认允许外部访问)。
  • 设置了密码:在 RedisInsight 中填写正确的 requirepass。
  • 防火墙/端口映射:确保宿主机防火墙未拦截,且容器端口正确映射(本例中已映射)。

备选方案(不推荐)

  • 使用宿主机 IP(如 192.168.x.x)代替 127.0.0.1,但 IP 可能变动,不够稳定。
  • 使用 --link 参数(已过时,不推荐)。

最佳实践

使用 docker-compose 管理多容器服务,Compose 会自动创建网络并支持服务名解析。

示例 docker-compose.yml:

version: '3'
services:
  redis:
    image: redis:alpine
    restart: always
    ports:
      - "6379:6379"
  redisinsight:
    image: redis/redisinsight:latest
    restart: always
    ports:
      - "5540:5540"
    volumes:
      - redis-insight:/data
volumes:
  redis-insight:

此时在 RedisInsight 中 Host 填写 redis 即可。

总结

在 Docker 容器间通信,优先使用自定义网络 + 容器名称,而非 127.0.0.1 或 localhost。牢记容器内的 127.0.0.1 只属于容器自己。

更多推荐