创建了一个 bridge network, 解决了容器之间网络访问问题, 但客户端连接 redis cluster 后, 获取到的节点的 ip 是 docker 分配给容器的 ip. 这肯定访问不了.
有大侠知道解决办法吗.. 头都秃噜皮了.
1
nvkou 2021-06-22 11:55:38 +08:00 via Android
容器之间使用容器名称访问。内部自带 Host 。
对外服务的端口映射回主机即可 |
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 即可访问到内部容器. |
4
BBCCBB OP @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 列表就是上面几个, 然后连接的时候就会 无法访问. |
5
UnknownR 2021-06-22 15:35:25 +08:00
docker 是隔离的,如果没有在运行时指定--network host,网络就只能像 NAT 一样,外部无法主动连,想要从外部访问只能将网络模型设置成 host 模式,或者将对应端口进行映射。
如果没有像 kubernetes 这样的编排工具,对网络的三层以上数据通信进行管理,那多个 docker 容器对于映射端口是有严格限制的,想要同时访问多个,只能把每个容器的对外端口映射都设置不同的端口,内部可以都是 6379 。 |
6
BBCCBB OP @UnknownR 害, mac 上 docker 不支持 host 模式, 已经打算用物理机直接启动多个 redis 来搞了 😢
|
7
minmini 2021-06-22 20:32:43 +08:00
redis 集群客户端访问单机就可以了吧,我记得获取数据的时候会自动吧对应机器里面的数据返回来
|
9
BBCCBB OP @minmini 对, 但是访问不在这个机器上的数据时,需要跳转到另一台机器, 这时候 ip 是 docker 内部 ip. 就出问题了
|
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 具体命令自行百度 |
11
cs419 2021-06-23 08:52:33 +08:00
方案 1 是在客户机上设置 静态路由
|
13
buddyy 2021-06-23 09:58:47 +08:00
一看就是没自己读文档的,哈哈。
用类似下面的启动命令即可。redis0 换成 ip 或你自己的容器名 /服务名 redis-server /etc/redis.conf --cluster-announce-ip redis0 |