准备
## 准备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
运行效果: