Docker 从另一个容器连接到 redis 容器时为什么报错 Name or service not known?

redisConnectOptions

const redisConnectOptions: RedisConnectOptions = {
    hostname: "redis://redis-stack",
    port: 6379,
};

docker-compose.yml

redis-stack:
    image: redis/redis-stack:latest
    container_name: redis-stack
    ports:
      - "6379:6379"
      - "6380:8001"
    networks:
      - my-network

docker log

2024-05-19 18:53:04 error: Uncaught (in promise) Error: failed to lookup address information: Name or service not known
2024-05-19 18:53:04         : await Deno.connect(dialOpts);
2024-05-19 18:53:04           ^
2024-05-19 18:53:04     at async Object.connect (ext:deno_net/01_net.js:587:55)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:190:11)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
2024-05-19 18:53:04     at async RedisConnection.#connect (https://deno.land/x/redis@v0.32.0/connection.ts:222:7)
阅读 1.9k
avatarAI BotBETA

错误信息表明在尝试连接到名为 redis://redis-stack 的 Redis 服务器时发生了 DNS 解析错误,即“Name or service not known”。这通常意味着客户端无法将主机名 redis://redis-stack 解析为 IP 地址。

问题出在 redisConnectOptionshostname 字段上。hostname 应该只包含 Redis 服务器的名称或 IP 地址,而不是包含协议前缀(如 redis://)。

修改后的 redisConnectOptions 应该是这样的:

const redisConnectOptions: RedisConnectOptions = {
    hostname: "redis-stack", // 移除 "redis://" 前缀
    port: 6379,
};

另外,请确保:

  1. 您的应用程序和 Redis 容器都在同一个 Docker 网络中(在您的 docker-compose.yml 文件中已经设置了 my-network)。
  2. 您的应用程序在尝试连接时使用了正确的容器名 redis-stack 来代替任何 IP 地址或外部主机名。

如果您的应用是在容器内运行的,请确保您的容器也在 my-network 网络中,以便能够解析 redis-stack 这个服务名。如果应用是在宿主机上运行的,您可能需要使用容器的 IP 地址或宿主机的 IP 地址(如果端口映射到了宿主机),并可能还需要调整防火墙规则以允许外部连接。

在大多数情况下,如果您的应用程序也在通过 Docker Compose 部署,那么只需使用容器名称即可进行通信,前提是它们都在同一个网络内。

2 个回答

错误信息表明在尝试连接到名为 redis://redis-stack 的 Redis 服务器时发生了 DNS 解析错误,即“Name or service not known”。这通常意味着客户端无法将主机名 redis://redis-stack 解析为 IP 地址。

问题出在 redisConnectOptionshostname 字段上。hostname 应该只包含 Redis 服务器的名称或 IP 地址,而不是包含协议前缀(如 redis://)。

修改后的 redisConnectOptions 应该是这样的:

const redisConnectOptions: RedisConnectOptions = {
    hostname: "redis-stack", // 移除 "redis://" 前缀
    port: 6379,
};
const redisConnectOptions: RedisConnectOptions = {
    hostname: "127.0.0.1",
    port: 6379,
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题