V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonLaw
V2EX  ›  Docker

由 Docker Redis 组成的 Redis cluster 在 macOS 上无法成功创建

  •  
  •   JasonLaw · 2020-08-27 12:24:52 +08:00 · 2325 次点击
    这是一个创建于 1546 天前的主题,其中的信息可能已经有所发展或是发生改变。

    启动多个实例

    for i in {7000..7002}
    do
       docker run -d --name Redis-cache-cluster-node-${i} \
          --network=host \
          -v Redis-cache-cluster-node-${i}_data:/data \
          redis:6.0.6 \
          redis-server --port ${i} --cluster-enabled yes --cluster-config-file nodes.conf -- cluster-node-timeout 5000 --appendonly yes
    done
    

    创建 cluster

    docker run -it --rm --network=host redis \
    redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
    

    在 Ubuntu 上面,是可以成功创建 cluster 的,但是在 macOS 上面却不行,一直卡在“Waiting for the cluster to join”,到底是为什么呢?


    关于网络问题,我已经查阅了ip - Docker container doesn't expose ports when --net=host is mentioned in the docker run command - Stack OverflowBlock/disallow --net=host (host networking) on Mac OS · Issue #2716 · docker/for-mac,并且尝试过使用-p ${i}:${i} -p $((${i} + 10000)):$((${i} + 10000))替换--network=host,结果还是不行。

    第 1 条附言  ·  2020-08-27 14:57:43 +08:00

    最后通过如下方法解决。

    docker network create --subnet=192.168.200.0/24 Redis-cache-cluster-network
    
    for i in {7000..7002}
    do
       docker run -d --name Redis-cache-cluster-node-${i} \
          --network=Redis-cache-cluster-network \
          --ip 192.168.200.$((${i} - 6990)) \
          -p ${i}:${i} -p $((${i} + 10000)):$((${i} + 10000)) \
          -v Redis-cache-cluster-node-${i}_data:/data \
          redis:6.0.6 \
          redis-server --port ${i} --cluster-enabled yes --cluster-config-file nodes.conf -- cluster-node-timeout 5000 --appendonly yes
    done
    
    docker run -it --rm --network=host redis \
    redis-cli --cluster create 192.168.200.10:7000 192.168.200.11:7001 192.168.200.12:7002
    
    第 2 条附言  ·  2020-08-27 15:45:26 +08:00

    创建了网络之后,Redis cluster里面的节点之间的通信没问题,但是应用不是运行在这个网络的。所以最后我选择使用Grokzen/docker-redis-cluster: Dockerfile for Redis Cluster (redis 3.0+)来创建本地Redis cluster。

    6 条回复    2020-08-27 19:22:30 +08:00
    windghoul
        1
    windghoul  
       2020-08-27 13:37:53 +08:00
    创建一个虚拟网络,然后进到 docker 里面执行 cli 命令
    whileFalse
        3
    whileFalse  
       2020-08-27 14:01:13 +08:00
    先看看你的 Docker for Mac 有没有开代理。
    JasonLaw
        4
    JasonLaw  
    OP
       2020-08-27 15:02:43 +08:00
    @windghoul #2
    @whileFalse #3

    我想确认一下我理解的是不是正确的。--network=host 不行是因为 macOS 不支持,单纯使用-p ${i}:${i} -p $((${i} + 10000)):$((${i} + 10000))替换--network=host 不行是因为 redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 中的 127.0.0.1 (因为它们这三个容器都有自己的“动态”IP 地址)。对吗?
    windghoul
        5
    windghoul  
       2020-08-27 17:23:10 +08:00
    @JasonLaw #4 我之前创建的,在 linux 上,也不能用宿主机的 ip 进行集群添加,只能用它的虚拟 ip 进行添加,具体的原因我还没来得及研究
    qfdk
        6
    qfdk  
       2020-08-27 19:22:30 +08:00 via iPhone
    你要用 host 代替你的 127.0.0.1 你这个属于容器内部的通信 link 估计也可以
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3269 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:19 · PVG 20:19 · LAX 04:19 · JFK 07:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.