博客 / 詳情

返回

windows系統下使用docker以及docker-compose搭建redis集羣

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節點信息,其實也沒啥用,而且每次集羣關閉重啓會報錯,提示為非空節點,要刪除後重新啓動容器。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.