分为两组 yml
,先后启动
我们其实也可以用于一个 yml
文件,直接启动 6 个容器,但是:
redis
的数据节点(一主两从)
将下面的配置复制进去
version: '3.7'
services:
master:
image: 'redis:5.0.9'
container_name: redis-master
restart: always
command: redis-server --appendonly yes
ports:
- 6379:6379
slave1:
image: 'redis:5.0.9'
container_name: redis-slave1
restart: always
command: redis-server --appendonly yes --slaveof redis-master 6379
ports:
- 6380:6379
slave2:
image: 'redis:5.0.9'
container_name: redis-slave2
restart: always
commandcommand: redis-server --appendonly yes --slaveof redis-master 6379
ports:
- 6381:6379
sevices
:我们将要启动哪几个容器 master
、slave1
、slave2
(这些名字自定义)image
:当前的容器是基于哪个镜像创建的container_name
:容器名字restart
:异常情况终止后,是否重启command
:在启动 redis
服务器的时候,所用到的命令行选项 slaveof
后面不必写主节点 ip
,直接写主节点的容器名就行了ip
是什么,也不知道ports
:端口映射,宿主机:容器内部端口
docker
容器可以理解成一个轻量的虚拟机。在这个容器里,端口号和外面宿主机的端口号,是两个体系。如果容器外面用了个 5000
端口,容器内也能用 5000
端口,并不冲突6379
和容器 2 的 6379
之间是不会有冲突的这种映射过程,就非常像
NAT
NAT
功能的路由器,这个路由器能管理好几个局域网里面的机器NAT
设备上的某个端口,从而访问到局域网内部的某个设备的某个端口了docker-compose up -d
6379
端口的 redis
服务器之后,可以看到这是个主节点,下面还有两个从节点redis
的哨兵节点redis
哨兵节点,是单独的 redis
服务器进程
在哨兵节点的配置文件中,粘贴下面的配置
version: '3.7'
services:
sentinel1:
image: 'redis:5.0.9'
container_name: redis-sentinel-1
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/etc/redis/sentinel.conf
ports:
- 26379:26379
sentinel2:
image: 'redis:5.0.9'
container_name: redis-sentinel-2
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/etc/redis/sentinel.conf
ports:
- 26380:26379
sentinel3:
image: 'redis:5.0.9'
container_name: redis-sentinel-3
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/etc/redis/sentinel.conf
ports:
- 26381:26379
volumes
:在当前目录下创建出 sentinel1.conf
、sentinel2.conf
、sentinel3.conf
这三个配置文件,然后把这三个配置文件映射到即将创建的这三个容器中 port
:docker
的一个核心功能,能够进行端口的映射,容器内部乐意使用什么端口都行,映射出去之后,还是需要确保端口不能重复我们看一下这三个配置文件的具体细节
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
bind
:绑定一个 ip 地址,允许其他端口进行访问port
:主节点端口号sentinel monitor
:告诉 redis
节点,去监控哪个服务器 ip
,但是使用 docker
,docker
会自动进行域名解析redis
是否挂了,超过法定票数个哨兵意见一致,才确认挂了(更稳健,避免网络波动的影响造成误判)sentinel down-after-milliseconds
:心跳包的超时时间。超过超时时间之后包还没回来,就认为是挂了启动容器后,我们使用命令:
docker-compose logs
redis-master
) redis-master
相当于一个域名,docker
会进行域名解析,将其解析成对应容器的 ip(ip 可能会变,但是容器名字是不变的)使用 docker-compose
一下,启动了 N 个容器,此时 N 个容器都处于同一个“局域网”中
redis-server
节点,是一个局域网;三个哨兵节点,是另一个局域网解决方案:
可以使用 docker-compose
把此处的两组服务放到同一个局域网中
docker network ls
列出当前 docker
中的局域网redis server
节点,就相当于自动创建了第一个局域网。再启动后面三个哨兵节点,就直接让这三个节点加入到上面的局域网中,而不是创建新的局域网在刚刚的 yml
配置文件中,最后再加上
networks:
default:
external:
name: redis-data_default
完整配置为:
version: '3.7'
services:
sentinel1:
image: 'redis:5.0.9'
container_name: redis-sentinel-1
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel1.conf:/etc/redis/sentinel.conf
ports:
- 26379:26379
sentinel2:
image: 'redis:5.0.9'
container_name: redis-sentinel-2
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel2.conf:/etc/redis/sentinel.conf
ports:
- 26380:26379
sentinel3:
image: 'redis:5.0.9'
container_name: redis-sentinel-3
restart: always
command: redis-sentinel /etc/redis/sentinel.conf
volumes:
- ./sentinel3.conf:/etc/redis/sentinel.conf
ports:
- 26381:26379
networks:
default:
external:
name: redis-data_default
使用 docker network inspect redis-data_default
命令,可以查看 redis-data_default
网络被哪些容器连接
上述的操作,就完成了此处的配置
我们再打开 sentinel.conf
这三个配置问价,发现里面发生了变化
bind 0.0.0.0
port 26379
sentinel myid f1fd960a20a1ba19973fb8fee67b666e00b85f27
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
dir "/data"
sentinel monitor redis-master 172.18.0.2 6379 2
sentinel down-after-milliseconds redis-master 1000
sentinel config-epoch redis-master 0
sentinel leader-epoch redis-master 0
sentinel known-replica redis-master 172.18.0.3 6379
sentinel known-replica redis-master 172.18.0.4 6379
sentinel known-sentinel redis-master 172.18.0.7 26379 3437afc8086d37ea3204d3522a0640db2028e045
sentinel known-sentinel redis-master 172.18.0.6 26379 f1fd960a20a1ba19973fb8fee67b666e00b85f27
sentinel known-sentinel redis-master 172.18.0.5 26379 a6a389363f12cbb25085a22680575d297589c46a
sentinel current-epoch 0