docker-compose經過shell腳本一鍵安裝redis集羣

目標

以前我在經過docker安裝redis集羣的時候,按照網上的教程一步一步的來安裝,我也寫過我安裝成功的案例,若有須要,請看下文,可是docker雖然簡化了一些繁瑣的步驟,但不可避免的仍是有一些步驟須要本身手動寫命令,因此我就寫了個shell腳本,勵志經過一個命令便可完成redis集羣的部署node

Docker Compose部署Redis Clustergit

一鍵安裝redis集羣

1 編寫shell腳本

  • 新建install.sh腳本文件
#!/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端口程序員

2 如下腳本是爲了測試集羣以及從新部署使用

  • 新建delete_redis_cluster.sh
#!/bin/bash
for port in `seq 6391 6396`; do
docker stop "redis-"${port}
sleep 1
docker rm "redis-"${port}
done
複製代碼
  • show_cluster_info.sh
#!/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

相關文章
相關標籤/搜索