在M1版MacBook上测试Docker并部署Redis主从集群+哨兵模式

今年11月份苹果发布arm架构M1芯片版MacBook,Docker官方随即表示已着手适配工作,现在第7个技术预览版已经开始公测。这速度....然而晴天霹雳,kubernetes宣布即将弃用Docker...

M1 芯片软件适配进度可以在这里查看


先随便配张图来假装图文并茂...

m1不支持redis启动吗 m1 安装redis_redis

正文

大致步骤

  1. 安装Docker技术预览版(目前最新第7版)下载链接
  2. 拉取 portainer 镜像(容器编排工具) 官网地址
  3. 拉取 ARM版Redis 镜像
  4. 完成Redis主从配置+哨兵配置
  5. 测试主从复制和哨兵故障转移

Docker的下载与安装省略300字

需要注意的是
  • 最好配置国内加速源
  • 根据宿主机内存调整Docker内存大小
  • 知悉Docker官方发布的目前已知问题(免得到时遇到坑还以为是自己的问题)
配置加速源

m1不支持redis启动吗 m1 安装redis_Docker_02

m1不支持redis启动吗 m1 安装redis_redis_03

国内源

Docker中国区官方镜像
https://registry.docker-cn.com

网易
http://hub-mirror.c.163.com

ustc
https://docker.mirrors.ustc.edu.cn

中国科技大学
https://docker.mirrors.ustc.edu.cn

阿里云容器 服务
https://cr.console.aliyun.com/

调整内存

m1不支持redis启动吗 m1 安装redis_MacBook_04

Docker官方目前已知问题

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_05


拉取portainer镜像

  • portainer有什么用?
  • 快速部署(配合yaml配置文件)
  • 容器编排
  • 镜像管理
  • Swarm集群管理
  • 权限管理(针对多运维)
  • 日志审计

进入终端

docker pull --platform=linux/arm64 portainer/portainer-ce@sha256:e5694c14b8a4c72e609e57c307b9346d0128ec5150bf4e87a4485b459d5089f0 #arm64版本
这串sha256可以在这里找到,其他镜像同理


m1不支持redis启动吗 m1 安装redis_Redis_06

可能有些人觉得奇怪,docker pull 镜像名 不就完事了吗,为啥还有sha256:xxxxxxxxxxxx这一串

原因是因为我们需要arm版镜像,指定DIGEST,这样下载下来体积相对小点。

然后把刚刚拉取的镜像跑起来

docker volume create portainer_data  #创建一个挂载文件夹docker run -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -d portainer/portainer-ce 
#这句就把portainer镜像跑起来了,注意这里是9000端口,左边9000端口可以改为你喜欢并未使用的端口。简单介绍一下参数意思,-p 映射宿主机和容器内的端口,-v 映射宿主机和容器的目录 -d 是后台运行,「-v /var/run/docker.sock:/var/run/docker.sock」这段简单理解为portainer把Docker管理权拿到手。
然后打开portianer后台管理

m1不支持redis启动吗 m1 安装redis_redis_07

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_08

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_09

portainer介绍完毕下面开始Redis部分


拉取Redis镜像

docker pull redis@sha256:0b23dbaf740ab5e25623f853ece6e2473efef2a3becbac44fa46c53bf669d645
docker tag 镜像id redis:my #标记镜像,待会yaml配置要用,镜像id可以通过 docker images 查看

编写主从docker-compose.yml配置(一主两从)

version: '2'
services:
#redis主库
  redis_7001_master:
     image: $image #$image环境变量,下面同理
     container_name: redis_7001_Master
     restart: always
     network_mode: bridge
     ports:
        - 7001:6379
     command: redis-server --replica-announce-ip $ip --replica-announce-port 7001 #$ip环境变量,下面同理

#redis从库
  redis_7002_slave:
    image: $image  
    container_name: redis_7002_slave
    restart: always
    network_mode: bridge
    depends_on:
       - redis_7001_master
    ports:
       - 7002:6379
    command: redis-server --slaveof $ip 7001 --replica-announce-ip $ip --replica-announce-port 7002

 #redis从库
  redis_7003_slave:
    image: $image  
    container_name: redis_7003_slave
    restart: always
    network_mode: bridge
    depends_on:
       - redis_7001_master
    ports:
       - 7003:6379
    command: redis-server --slaveof $ip 7001 --replica-announce-ip $ip --replica-announce-port 7003

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_10

m1不支持redis启动吗 m1 安装redis_MacBook_11

点击 Deploy the stack

m1不支持redis启动吗 m1 安装redis_MacBook_12

点进去查看主库日志

m1不支持redis启动吗 m1 安装redis_Redis_13

从库同步数据成功
主从搭建完成,单纯主从集群是非常不可靠的,因为从库是只读的,主库掉线就没法写了。所以需要引入哨兵模式来监控和执行故障转移。

哨兵模式

官方文档

作用

m1不支持redis启动吗 m1 安装redis_Docker_14

完成后的是这样

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_15

当然,也可以把哨兵部署在从库所在的服务器上。


m1不支持redis启动吗 m1 安装redis_redis_16

哨兵们会根据主库给出的信息自动发现从库地址和端口,所以只需要监控主库就可以了。
配置文件:

sentinel.conf

port 26379 #哨兵容器内端口
sentinel announce-ip 172.20.10.2 #强制声明IP
sentinel announce-port 7004 #强制指定对外公开的端口
dir "/data" #工作目录

sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 172.20.10.2 7001 2 # 宿主机内网IP,端口,quorum(quorum个哨兵哨兵达成一致的情况下才会判断主库客观掉线(+odown))
sentinel down-after-milliseconds mymaster 3000 #3秒内主库没有正确给哨兵响应心跳,哨兵即认为主库主观掉线(+sdown)
sentinel failover-timeout mymaster 5000 #指定故障转移超时(以毫秒为单位)当进行failover时,配置所有slaves指向新的master所需的最大时间。

以上announce-port不一样,一式三份
哨兵 docker-compose.yml
version: "2"
services: 
  redis_sentinel7004:
    image: redis:my
    container_name: redis_sentinel7004
    network_mode: bridge
    ports: 
      - 7004:26379
    volumes: 
      - /Users/cyy/own/Dev/sentinel/s7004:/usr/local/etc/redis/
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf

  redis_sentinel7005:
    image: redis:my
    container_name: redis_sentinel7005
    network_mode: bridge
    ports: 
      - 7005:26379
    volumes: 
      - /Users/cyy/own/Dev/sentinel/s7005:/usr/local/etc/redis/
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf

  redis_sentinel7006:
    image: redis:my
    container_name: redis_sentinel7006
    network_mode: bridge
    ports: 
      - 7006:26379
    volumes: 
      - /Users/cyy/own/Dev/sentinel/s7006:/usr/local/etc/redis/
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
目录结构是这样(文件夹名是s+端口)


m1不支持redis启动吗 m1 安装redis_redis_17


又回到portianer

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_18

m1不支持redis启动吗 m1 安装redis_redis_19

点击Deploy the stack

m1不支持redis启动吗 m1 安装redis_m1不支持redis启动吗_20

m1不支持redis启动吗 m1 安装redis_Docker_21

哨兵已经成功监控主库并发现了两个从库和另外两个哨兵。

测试故障转移

redis-cli -h 172.20.10.2 -p 7001 DEBUG sleep 30 #在宿主机上进入终端,连上主库睡眠30秒(模拟宕机)

m1不支持redis启动吗 m1 安装redis_MacBook_22

大功告成,哨兵已经把端口为7002的从库成功切换成主库了


写得有点乱,见谅。
给大家拜个早年!祝大家写代码永无bug🙏!