docker redis集羣搭建
linux轉windows的吐槽:
首先redis官方就不支持windows系統。。。
想使用docker搭建一個可以從外部訪問的Redis Cluster, 本來可以很方便的使用Docker network中的host driver,但host network目前只有在Linux上才支持,在Linux系統下使用docker搭建redis集羣很簡單很方便,網上的大部分教程也是針對linux下使用host模式的,這裏不再詳述。
但docker desktop for windows並不支持此種方式,因此只有使用默認的docker bridge橋接方式。
在bridge橋接下,docker會為每一個容器分配一個內部使用的ip(供容器間通信使用),創建集羣時可以使用該ip。
該ip可以通過如下方式獲得:
docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis1
redis1 是容器名,替換為你的容器名
docker exec -it redis1 bash
進入該容器後
redis-cli --cluster create <你剛剛獲得的ip>:7000 <你剛剛獲得的ip>:7001 <你剛剛獲得的ip>:7002 --cluster-replicas 0
此時redis集羣已經搭建成功
這裏為了方便,可以多加入一個容器在該容器中執行以上命令。
docker網絡管理
每次查詢docker容器分配的ip是一件比較麻煩的事情,你可以在創建子網後給你的docker容器指定該子網下的ip
docker network create --subnet=172.20.0.0/16 redis-net
eg:
redis1:
networks: #指定bridge分配的ip地址
redis-net:
ipv4_address: 172.20.0.3
這樣創建時就可以使用固定ip
代碼示例
目錄結構:
redis-cluster
-7000
-conf
redis.conf
-7001
-conf
redis.conf
-7002
-conf
redis.conf
docker-compose.yml
redis.conf如下:
port 7000 #對外端口,redis默認的就是6379
protected-mode no
daemonize no
appendonly no #數據持久化,這裏不開啓,我就是local起個集羣
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 172.31.36.43 #本機ip,外部訪問該集羣的ip
cluster-announce-port 7000 #集羣內部,一般和上面設置成一樣
cluster-announce-bus-port 17000
docker-compose.yml如下:
version: '3'
services:
redis-cluster: #上面提到的加入一個容器在該容器中執行創建集羣命令,同樣也要加入到自定義的子網絡中
image: redis:6.0.8
networks:
redis-net:
ipv4_address: 172.20.0.2
command: redis-cli --cluster create 172.20.0.3:7000 172.20.0.4:7001 172.20.0.5:7002 --cluster-replicas 0 --cluster-yes
depends_on:
- redis1
- redis2
- redis3
redis1: # 服務名稱
image: redis:6.0.8 # 創建容器時所需的鏡像
container_name: redis1 # 容器名稱
restart: always # 容器總是重新啓動
networks: #指定bridge分配的ip地址
redis-net:
ipv4_address: 172.20.0.3
ports:
- 7000:7000
- 17000:17000
volumes: # 數據卷,目錄掛載
- ./7000/conf/redis.conf:/etc/redis/redis.conf
- ./7000/data:/data
command: redis-server /etc/redis/redis.conf # 覆蓋容器啓動後默認執行的命令
redis2:
image: redis:6.0.8
container_name: redis2
restart: always
networks:
redis-net:
ipv4_address: 172.20.0.4
ports:
- 7001:7001
- 17001:17001
volumes:
- ./7001/conf/redis.conf:/etc/redis/redis.conf
- ./7001/data:/data
command: redis-server /etc/redis/redis.conf
redis3:
image: redis:6.0.8
container_name: redis3
restart: always
networks:
redis-net:
ipv4_address: 172.20.0.5
ports:
- 7002:7002
- 17002:17002
volumes:
- ./7002/conf/redis.conf:/etc/redis/redis.conf
- ./7002/data:/data
command: redis-server /etc/redis/redis.conf
#引用一個已經存在的網絡以及網段,可以自由分配和指定,只有使用redis-net網絡的容器才會按照網段分配。
#其餘容器不受影響,依然是由docker內置的bridge網段分配
networks:
redis-net:
external: true
volumes:
redis1_data:
redis2_data:
redis3_data:
操作步驟
在上面的代碼示例基礎上
給redis-cluster創建子網,使用172.20.0.0網段,各個redis節點的ip指定見docker-compose.yml
如果創建子網失敗,可以查詢當前docker下的network狀態,自行更換網段(如172.19.0.0)
docker network create --subnet=172.20.0.0/16 redis-net
查找本機ip,修改redis-cluster/700*/conf/redis.conf文件中cluster-announce-ip值為本機ip
windows下: ipconfig
linux下: ifconfig
使用docker後台運行依賴的各個組件
cd redis-cluster
docker-compose -f docker-compose-local.yml up -d
至此,可以使用127.0.0.1的7000、7001、7002端口訪問集羣節點
其他
host模式:
docker 指定network為host:
docker容器將不會分配ip地址,將自身端口完全綁定到宿主機ip上,可以直接通過宿主機ip外部訪問,因此沒有手動獲取各個容器ip的過程
直接在宿主機上使用127.0.0.1:<端口號>即可create集羣
docker數據卷volume管理:
local下不建議開啓,沒啥意義,如果想要搭建一個穩定點的可以考慮開啓。
目前只用了redis的nodes.conf記錄redis節點信息,其實也沒啥用,而且每次集羣關閉重啓會報錯,提示為非空節點,要刪除後重新啓動容器。