以前我在經過docker安裝redis集羣的時候,按照網上的教程一步一步的來安裝,我也寫過我安裝成功的案例,若有須要,請看下文,可是docker雖然簡化了一些繁瑣的步驟,但不可避免的仍是有一些步驟須要本身手動寫命令,因此我就寫了個shell腳本,勵志經過一個命令便可完成redis集羣的部署node
Docker Compose部署Redis Clustergit
#!/bin/bash
# 建立redis掛載目錄
echo "step 1 -> 建立redis安裝位置------"
mkdir -p /usr/local/docker/volumes/redis-cluster
cd /usr/local/docker/volumes/redis-cluster
echo "step 2 -> 建立redis-cluster.tmpl模板------"
cat <<'EOF'> redis-cluster.tmpl
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip ${CLUSTER_ANNOUNCE_IP}
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
EOF
#for port in `seq 6391 6396`; do \
#firewall-cmd --zone=public --add-port=${port}/tcp --permanent
#done
echo "step 3 -> 建立redis數據配置掛載目錄------"
CLUSTER_ANNOUNCE_IP=127.0.0.1
echo ${CLUSTER_ANNOUNCE_IP}
for port in `seq 6391 6396`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} CLUSTER_ANNOUNCE_IP=${CLUSTER_ANNOUNCE_IP} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
echo "step 4 -> 建立redis docker-compose.yaml 模板------"
cat <<EOF > docker-compose.yaml
version: '3'
services:
redis-6391:
image: redis:latest
container_name: redis-6391
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6391/data:/data
- /usr/local/docker/volumes/redis-cluster/6391/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6391:6391
- 16391:16391
redis-6392:
image: redis:latest
container_name: redis-6392
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6392/data:/data
- /usr/local/docker/volumes/redis-cluster/6392/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6392:6392
- 16392:16392
redis-6393:
image: redis:latest
container_name: redis-6393
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6393/data:/data
- /usr/local/docker/volumes/redis-cluster/6393/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6393:6393
- 16393:16393
redis-6394:
image: redis:latest
container_name: redis-6394
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6394/data:/data
- /usr/local/docker/volumes/redis-cluster/6394/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6394:6394
- 16394:16394
redis-6395:
image: redis:latest
container_name: redis-6395
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6395/data:/data
- /usr/local/docker/volumes/redis-cluster/6395/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6395:6395
- 16395:16395
redis-6396:
image: redis:latest
container_name: redis-6396
command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes
privileged: true
restart: always
volumes:
- /usr/local/docker/volumes/redis-cluster/6396/data:/data
- /usr/local/docker/volumes/redis-cluster/6396/conf/redis.conf:/usr/local/etc/redis/redis.conf
ports:
- 6396:6396
- 16396:16396
EOF
echo "docker-compose redis 生成成功!"
echo "step 5 -> 運行docker-compose 部署啓動redis容器------"
# 運行docker-compose啓動redis容器
docker-compose -f docker-compose.yaml up -d
exist=$(docker inspect --format '{{.State.Running}}' redis-6391)
if [[${exist}!='true']];
then
sleep 3000
else
echo 'redis容器啓動成功!'
IP_RESULT=""
CONTAINER_IP=""
for port in `seq 6391 6396`;
do
#CONTAINER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis-${port})
IP_RESULT=${IP_RESULT}${CLUSTER_ANNOUNCE_IP}":"${port}" "
done
fi
echo "獲取redis容器ip和端口號:" ${IP_RESULT}
echo "step 6 -> redis 執行集羣指令------"
docker run --rm -it inem0o/redis-trib create --replicas 1 ${IP_RESULT}
複製代碼
注意 CLUSTER_ANNOUNCE_IP:要換成你的公網ip,就是你能夠訪問到的ip, 同時執行腳本前,先開放6391~6396 以及16391~16396端口程序員
#!/bin/bash
for port in `seq 6391 6396`; do
docker stop "redis-"${port}
sleep 1
docker rm "redis-"${port}
done
複製代碼
#!/bin/bash
docker exec -it redis-6391 redis-cli -p 6391 -a 123456
複製代碼
當你執行show_cluster_info.sh,再輸入cluster nodes 或者 cluster infogithub
若是你以爲上述步驟以爲仍是有點麻煩能夠下載我上傳到github的代碼redis
redis-clusterdocker
程序員的天性就是懶,個人目標就是解放雙手,點一下就安裝成功,豈不爽哉~shell