使用Docker Swarm快速搭建Redis集群

5,335 阅读1分钟
原文链接: blog.sunwaiting.com

准备

## 准备swarm环境
> docker swarm init

## 如果没有redis镜像,拉取镜像
> docker pull redis

默认目录 /path/to/redis
默认配置文件目录 /path/to/redis/config

配置文件

主redis服务配置

/path/to/redis/config/master.conf

## 自定义配置

从redis服务配置

/path/to/redis/config/slave.conf

## 自定义配置
slaveof master 6379

docker-compose 配置

compose配置详情 : docs.docker.com/compose/com…

/path/to/redis/redis-compose.yml

version: '3.7'
services:
  master:
    image: redis
    restart: always
    hostname: redis-master
    command: [ "redis-server", "/usr/local/etc/redis/redis.conf"]
    volumes:
      - /path/to/redis/config/master.conf:/usr/local/etc/redis/redis.conf
    ports:
      - 6379:6379
  slave:
    image: redis
    restart: always
    hostname: redis-slave
    command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    ports:
      - 6378:6379
    volumes:
      - /path/to/redis/config/slave.conf:/usr/local/etc/redis/redis.conf


官方的redis镜像,Dockerfile的启动逻辑 如下:

...
COPY docker-entrypoint.sh /usr/local/bin/
ENTRYPOINT ["docker-entrypoint.sh"]

EXPOSE 6379
CMD ["redis-server"]

启动脚本是docker-entrypoint.sh

...
# first arg is `-f` or `--some-option`
# or first arg is `something.conf`
if [ "${1#-}" != "$1" ] || [ "${1%.conf}" != "$1" ]; then
	set -- redis-server "$@"
fi
...

从docker-entrypoint.sh可知我们可以修改command命令来自定义配置

启动

接下来我们只要运行就ok了

/path/to/redis > docker stack deploy -c redis-compose.yml redis

Creating network redis_default
Creating service redis_master
Creating service redis_slave

## 运行docker stack ls 可以看到现在有两个redis services
/path/to/redis > docker stack ls
NAME                SERVICES            ORCHESTRATOR
redis               2                   Swarm

## 验证主从
### master 实例
/path/to/redis >  redis-cli -p 6379 info | grep -A 2 role
role:master
connected_slaves:1
slave0:ip=10.0.5.2,port=6379,state=online,offset=322,lag=1

### slave 实例
/path/to/redis > redis-cli -p 6378 info | grep -A 3 role
role:slave
master_host:master
master_port:6379
master_link_status:up

运行效果:
效果