无法创建服务器 TCP 监听套接字 *:6383 绑定:无法在 docker 上的 redis 集群中分配请求的地址(在 Windows 中)

Posted

技术标签:

【中文标题】无法创建服务器 TCP 监听套接字 *:6383 绑定:无法在 docker 上的 redis 集群中分配请求的地址(在 Windows 中)【英文标题】:Could not create server TCP listening socket *:6383 bind: Cannot assign requested address in redis clustering on docker (in windows) 【发布时间】:2021-12-15 15:05:50 【问题描述】:

我正在尝试在 windows docker 上设置 redis 集群。 它只能在 redis-cli -h 127.0.0.1 -p 6383 inside docker container CLI 中正常工作,所有节点都很好,集群没有问题。这是 redis.config 文件节点之一

redis.config 文件

port 6383
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf 
cluster-node-timeout 5000
appendonly yes

问题出在上面的配置,应用无法访问集群,因为应用无法访问集群(这个应用在redis单模式下运行正常)

当我将“绑定”redis.conf 文件更改为我的计算机 IP 192.168.3.205 时,我收到此错误 enter image description here

我尝试了以下方法:

    在防火墙卷中打开上述端口 使用 telnet 命令似乎没有人在此端口上监听

远程登录 192.168.3.205 6383 和 127.0.0.1 6383

    netstat prot 6383 未被任何人使用

这是我的 .yml 文件

version: "3.8"

networks:
  default:
    name: amin-cluster

services:
  redis0:
    container_name: node-0
    image: mnadeem/redis 
    network_mode: "host"
    volumes:
    - C:\Windows\System32\6379\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-0
    restart: always
  redis1:
    container_name: node-1
    image: mnadeem/redis 
    network_mode: "host"
    volumes: 
    - C:\Windows\System32\6380\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-1
    restart: always
  redis2:
    container_name: node-2
    image: mnadeem/redis 
    network_mode: "host"
    volumes: 
    - C:\Windows\System32\6381\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-2
    restart: always
  redis3:
    container_name: node-3
    image: mnadeem/redis 
    network_mode: "host"
    volumes:
     - C:\Windows\System32\6382\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-3
    restart: always
  redis4:
    container_name: node-4
    image: mnadeem/redis 
    network_mode: "host"
    volumes:
    - C:\Windows\System32\6383\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-4
    restart: always
  redis5:
    container_name: node-5
    image: mnadeem/redis 
    network_mode: "host"
    volumes: 
    - C:\Windows\System32\6384\redis.conf:/usr/local/etc/redis/redis.conf
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    build:
      context: .
      dockerfile: Dockerfile
    hostname: node-5
    restart: always

【问题讨论】:

你能说明你是如何启动容器的吗?您很可能忘记发布端口(将主机端口绑定到容器端口) @Matthew 我在 redis.conf 文件中设置了端口,然后我使用 ">docker-compose up -d " 我需要在其他地方设置端口还是我想如何告诉容器从特定端口开始。在单模式下,我选择容器的图像名称,并告诉端口如 6060:6379 但这里我不知道 我添加了一个应该有帮助的答案,redis 团队自己提供的标准 redis 图像也非常可靠,使用 3rd 方图像有什么特别的理由吗? (mnadeem/redis),编辑:nvm 我看到这些图像是针对集群的。 @Matthew 抱歉,我在其文档中找不到 docker 的任何集群配置。我还在努力我似乎被卡住了你有什么指导可以使用这个标准的 Redis 映像在 docker 上实现 Redis 集群吗? 不确定,但如果您需要更多帮助,您应该问第二个问题。对于访问端口的紧迫问题,我提供的答案是否解决了问题? 【参考方案1】:

在您的 docker compose yml 中,您需要发布端口,并为您希望从主机访问的每个服务设置一个。

redis0:
    ports:
      - "6383:6383"
    ...
redis1:
    ports:
      - "12345:6383"

语法是“hostport:containerport”,因为您有 6 个 redis 实例,假设您希望每个可访问的每个主机端口都需要不同。

如果您不需要从主机访问端口,您显然可以省略端口。

有关如何发布端口的更多详细信息,请阅读 docker compose yml docs https://docs.docker.com/compose/compose-file/compose-file-v3/#ports

【讨论】:

谢谢你,我通过了这个问题,但不是完全。尝试使用命令“redis-cli --cluster create : ...”配置节点时,我遇到了另一个问题,自动分配像 172.21.0.1 这样的 IP,而不是我给它的 IP跨度> @aminrahmati 我建议你解决这个问题并为你的新问题创建一个新问题。 *** 最适合在提出特定问题并获得特定答案时使用,并且通过对现有问题提出后续问题,您很可能不会获得很大的吸引力。

以上是关于无法创建服务器 TCP 监听套接字 *:6383 绑定:无法在 docker 上的 redis 集群中分配请求的地址(在 Windows 中)的主要内容,如果未能解决你的问题,请参考以下文章

TCP套接字端口复用SO_REUSEADDR

23TCP通信

Python网络编程_TCP(简略版)

linux内核如何区分连接套接字和监听套接字?

Python—网络编程之tcp编程

网络编程套接字