求教, docker 安装 redis cluster 后, 客户端/redis-cli -c 跳转啥的访问到的是 docker 内部的 ip. 连接失败. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
BBCCBB
V2EX    程序员

求教, docker 安装 redis cluster 后, 客户端/redis-cli -c 转啥的访问到的是 docker 内部的 ip. 连接失败.

  •  
  •   BBCCBB 2021-06-22 11:28:55 +08:00 2259 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    创建了一个 bridge network, 解决了容器之间网络访问问题, 但客户端连接 redis cluster 后, 获取到的节点的 ip 是 docker 分配给容器的 ip. 这肯定访问不了.

    有大侠知道解决办法吗.. 头都秃噜皮了.

    16 条回复    2021-06-23 14:44:28 +08:00
    nvkou
        1
    nvkou  
       2021-06-22 11:55:38 +08:00 via Android
    容器之间使用容器名称访问。内部自带 Host 。
    对外服务的端口映射回主机即可
    BBCCBB
        2
    BBCCBB  
    OP
       2021-06-22 12:06:18 +08:00
    @nvkou
    > 对外服务的端口映射回主机即可

    请问这个要咋操作呢? 添加一个 host network 吗?
    nvkou
        3
    nvkou  
       2021-06-22 13:16:28 +08:00
    @BBCCBB 这个拓扑不好说呢
    在创建容器时,比如说 docker-compose 文件里给每个容器指定名称(比如 A,B), 然后这个容器组里指定一个网络(比如 network1). 然后你配置文件里就可以用名称指代容器.假设在容器创建时 A 获得 ip 10.0.0.5. 那么 b 的 redis 配置文件里可以简单用 A:6379 指代 10.0.0.5:6379 简单理解为 docker 内部有 host 帮你路由即可. 因为是桥接网络,从容器组外部访问容器(包括从宿主机)就必须走网桥. 因此你的宿主机要做好这一块的路由以便对本地或外部访问

    端口映射是针对容器而言的. 对应 docker 的 -p 参数. 假设你的集群是固定的一个容器对外暴露服务,那么只需要使用 -p 参数 映射容器内部端口到宿主机端口即可.这部分魔法由 docker 提供.

    举个例子 docker run tomcat -p 8080:80 起来一个容器之后, 在宿主机访问 localhost:80 即可访问到内部容器.
    BBCCBB
        4
    BBCCBB  
    OP
       2021-06-22 13:48:34 +08:00
    @nvkou 我现在容器之间访问没问题了. 外部也能访问.


    但每个 redis 实例的 ip 是 docker 分配的. 比如

    redis1: 172.18.0.1:6379, 这些 ip 都是 docker network 内部分配, 宿主机访问不到
    redis2: 172.18.0.2:6379
    redis3: 172.18.0.1:6379

    redis1 的 port 映射比如是 50000:6379, 我在宿主机是能通过 127.0.0.1:50000 访问到单个节点的.


    用 redis 客户端连接上之后, 获取到的 redis 集群的 ip 列表就是上面几个, 然后连接的时候就会 无法访问.
    UnknownR
        5
    UnknownR  
       2021-06-22 15:35:25 +08:00
    docker 是隔离的,如果没有在运行时指定--network host,网络就只能像 NAT 一样,外部无法主动连,想要从外部访问只能将网络模型设置成 host 模式,或者将对应端口进行映射。

    如果没有像 kubernetes 这样的编排工具,对网络的三层以上数据通信进行管理,那多个 docker 容器对于映射端口是有严格限制的,想要同时访问多个,只能把每个容器的对外端口映射都设置不同的端口,内部可以都是 6379 。
    BBCCBB
        6
    BBCCBB  
    OP
       2021-06-22 17:59:37 +08:00
    @UnknownR 害, mac 上 docker 不支持 host 模式, 已经打算用物理机直接启动多个 redis 来搞了
    minmini
        7
    minmini  
       2021-06-22 20:32:43 +08:00
    redis 集群客户端访问单机就可以了吧,我记得获取数据的时候会自动吧对应机器里面的数据返回来
    aobamaM
        8
    aobamaM  
       2021-06-22 20:51:01 +08:00
    @nvkou 在宿主机访问 localhost:8080 即可访问到内部容器
    BBCCBB
        9
    BBCCBB  
    OP
       2021-06-22 22:48:49 +08:00
    @minmini 对, 但是访问不在这个机器上的数据时,需要跳转到另一台机器, 这时候 ip 是 docker 内部 ip. 就出问题了
    cs419
        10
    cs419  
       2021-06-23 08:51:21 +08:00
    假定
    docker 宿主机 ip 为 192.168.3.4
    docker 默认给容器分配的 ip 为 172.18.0.x

    方案 1: 设置静态路由
    设置路由 172.18.0.0 的网关为 192.168.3.4

    方案 2: 指定容器的网络
    启动容器时 设置 --network 成桥接
    可以让 docker 默认给容器分配的 ip 为 192.168.3.x

    具体命令自行百度
    cs419
        11
    cs419  
       2021-06-23 08:52:33 +08:00
    方案 1 是在客户机上设置 静态路由
    BBCCBB
        12
    BBCCBB  
    OP
       2021-06-23 09:22:52 +08:00
    @cs419 已经放弃, 直接物理机搞了 哈哈
    buddyy
        13
    buddyy  
       2021-06-23 09:58:47 +08:00
    div class="reply_content">一看就是没自己读文档的,哈哈。
    用类似下面的启动命令即可。redis0 换成 ip 或你自己的容器名 /服务名
    redis-server /etc/redis.conf --cluster-announce-ip redis0
    BBCCBB
        14
    BBCCBB  
    OP
       2021-06-23 10:17:00 +08:00
    @buddyy 我试试这个方式, 我之前在 redis.conf 里设置了 cluster-announce-ip 为 127.0.0.1, 没成功
    julyclyde
        15
    julyclyde  
       2021-06-23 14:14:22 +08:00
    @BBCCBB 你为啥要 announce 127 这个 IP 呢?思维方式很有问题啊
    BBCCBB
        16
    BBCCBB  
    OP
       2021-06-23 14:44:28 +08:00
    @julyclyde 因为 docker 内部的 ip 宿主机访问不到啊, 得直接 announce 宿主机的 ip?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     881 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 22:37 PVG 06:37 LAX 15:37 JFK 18:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86