【问题标题】:How to connect to Redis from inside Docker container using redis-rs?如何使用 redis-rs 从 Docker 容器内部连接到 Redis?
【发布时间】:2020-06-29 08:32:27
【问题描述】:

代码

https://github.com/thiskevinwang/rust-redis-docker/tree/for-*

上下文:

  • 用 Rust 编写
  • Cargo.toml:
    [dependencies]
    redis = "0.16.0"
    hyper = "0.13"
    

本地开发✅

有效的方法:

  • 运行一个redis docker容器bitnami/redis,发布于-p 6379:6379
  • redis-cli 可以成功连接到这个 docker 容器
  • 浏览器可以在localhost:3000找到锈代码
    • GET / 显示一些文字 ✅
    • GET /redis 在 redis 中增加一个计数器,并显示它✅

在 docker 中运行 rust-code ❌

rust docker容器连接redis docker容器失败

  • 运行同一个redis docker容器bitnami/redis
  • 浏览器可以在localhost:3000 访问 rust-container
    • GET / 显示一些文字,和以前一样✅
    • GET /redis 导致 rust 代码恐慌 ❌

      连接被拒绝(操作系统错误 111)


我不确定这是否是我错误处理“docker 网络”的问题,或者我是否错误地使用了redis crate(尽管文档很少)。

【问题讨论】:

标签: docker redis rust hyper


【解决方案1】:

你有这个在docker-compose.yaml:

services:
  hyper:
    build: .
    ports:
      - "3000:3000"
    expose:
      - "3000"
    links:
      - redis # links this container to "redis" container
  redis:
    image: "bitnami/redis:latest"
    ports:
      - "6379:6379"
    expose:
      - "6379"

From the Docker Compose docs on links:

可以通过与别名相同的主机名访问链接服务的容器,如果未指定别名,则使用服务名。

因此错误出现在main.rs 的第 70 行:

let client = redis::Client::open("redis://127.0.0.1:6379")?;

这不起作用,因为 redis 实例没有在与您的 Rust 代码相同的容器中运行。您必须通过 docker compose 文件中建立的链接连接到它,在本例中为:

let client = redis::Client::open("redis://redis:6379")?;

完成此修复后,获取 GET localhost:3000/redis 将成功返回。

【讨论】:

  • ? 魔法!感谢@pretzelhammer 这么快的回答/解决方案!
  • 你不需要links:expose: 来工作;您可以通过其 Compose 服务名称连接到容器进程正在侦听的端口,而无需特殊设置。 Networking in Compose 进一步描述了这一点。 (您仍然需要更改连接字符串中的主机名,因为localhost 通常是“此容器”。)