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 · 1911 次点击
    这是一个创建于 1279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    创建了一个 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
    一看就是没自己读文档的,哈哈。
    用类似下面的启动命令即可。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   ·   实用小工具   ·   1404 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 17:01 · PVG 01:01 · LAX 09:01 · JFK 12:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.