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

2021-06-22 11:28:55 +08:00
 BBCCBB

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

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

1707 次点击
所在节点    程序员
16 条回复
nvkou
2021-06-22 11:55:38 +08:00
容器之间使用容器名称访问。内部自带 Host 。
对外服务的端口映射回主机即可
BBCCBB
2021-06-22 12:06:18 +08:00
@nvkou
> 对外服务的端口映射回主机即可

请问这个要咋操作呢? 添加一个 host network 吗?
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
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
2021-06-22 15:35:25 +08:00
docker 是隔离的,如果没有在运行时指定--network host,网络就只能像 NAT 一样,外部无法主动连,想要从外部访问只能将网络模型设置成 host 模式,或者将对应端口进行映射。

如果没有像 kubernetes 这样的编排工具,对网络的三层以上数据通信进行管理,那多个 docker 容器对于映射端口是有严格限制的,想要同时访问多个,只能把每个容器的对外端口映射都设置不同的端口,内部可以都是 6379 。
BBCCBB
2021-06-22 17:59:37 +08:00
@UnknownR 害, mac 上 docker 不支持 host 模式, 已经打算用物理机直接启动多个 redis 来搞了 😢
minmini
2021-06-22 20:32:43 +08:00
redis 集群客户端访问单机就可以了吧,我记得获取数据的时候会自动吧对应机器里面的数据返回来
aobamaM
2021-06-22 20:51:01 +08:00
@nvkou 在宿主机访问 localhost:8080 即可访问到内部容器
BBCCBB
2021-06-22 22:48:49 +08:00
@minmini 对, 但是访问不在这个机器上的数据时,需要跳转到另一台机器, 这时候 ip 是 docker 内部 ip. 就出问题了
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
2021-06-23 08:52:33 +08:00
方案 1 是在客户机上设置 静态路由
BBCCBB
2021-06-23 09:22:52 +08:00
@cs419 已经放弃, 直接物理机搞了 哈哈
buddyy
2021-06-23 09:58:47 +08:00
一看就是没自己读文档的,哈哈。
用类似下面的启动命令即可。redis0 换成 ip 或你自己的容器名 /服务名
redis-server /etc/redis.conf --cluster-announce-ip redis0
BBCCBB
2021-06-23 10:17:00 +08:00
@buddyy 我试试这个方式, 我之前在 redis.conf 里设置了 cluster-announce-ip 为 127.0.0.1, 没成功
julyclyde
2021-06-23 14:14:22 +08:00
@BBCCBB 你为啥要 announce 127 这个 IP 呢?思维方式很有问题啊
BBCCBB
2021-06-23 14:44:28 +08:00
@julyclyde 因为 docker 内部的 ip 宿主机访问不到啊, 得直接 announce 宿主机的 ip?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/785023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX