使用DockerCompose搭建Redis集群


一、安裝Docker Compose

1.下載docker-compose,我這里選擇1.25.5這個版本

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2.下載好之后,設置權限

sudo chmod +x /usr/local/bin/docker-compose

3.檢測是否安裝成功

docker-compose --version

出現下圖則表示安裝成功

二、Redis鏡像

1.下載redis鏡像,我這里選擇5.0.3

docker pull redis:5.0.3

2.查看鏡像

docker image ls -a

三、准備容器掛載的目錄

1.創建根目錄

mkdir /docker/redis

2.創建容器目錄,我這里采用3主1從的方式。端口分別為7001-7006。然后創建給每個節點創建對應的目錄和配置文件

mkdir 700{1..6}
mkdir 700{1..6}/data
mkdir 700{1..6}/config
touch 700{1..6}/config/redis.config

四、准備配置文件

1.將redis.config解壓后,復制到各個節點的config下

五、准備docker-compose.yml

vi docker-compose.yml

然后按鍵盤i,進入輸入模式
復制以下內容:

version: '3'

services:
 redis1:
  image: redis:5.0.3
  restart: always  
  volumes:
   - /docker/redis/7001/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7001/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7001:6379'     #服務端口
    - '17001:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量
  

 redis2:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7002/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7002/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7002:6379'     #服務端口
    - '17002:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量

 redis3:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7003/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7003/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7003:6379'     #服務端口
    - '17003:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量

 redis4:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7004/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7004/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7004:6379'     #服務端口
    - '17004:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量

 redis5:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7005/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7005/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7005:6379'     #服務端口
    - '17005:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量

 redis6:
  image: redis:5.0.3
  #network_mode: host
  restart: always
  volumes:
   - /docker/redis/7006/config/redis.conf:/etc/redis/redis.conf
   - /docker/redis/7006/data:/data
  environment:
   - TZ=Asia/Shanghai
   - LANG=en_US.UTF-8
  ports:
    - '7006:6379'     #服務端口
    - '17006:16379'   #集群端口
  command: ["redis-server", "/etc/redis/redis.conf"]
  privileged: true    #環境變量

按鍵盤esc,輸入:wq,保存文件

六、啟動容器

以后台啟動

docker-compose up -d


使用docker-compose ps查看容器列表,發現已經全部啟動


再使用docker container ls比較看下

七、組建集群

redis-cli -h 192.168.200.135 -p 7001 --cluster create 192.168.200.135:7001 192.168.200.135:7002 192.168.200.135:7003 192.168.200.135:7004 192.168.200.135:7005 192.168.200.135:7006 --cluster-replicas 1

八、查看集群信息

可以看到主從關系

注意

1.使用docker-compose的方式,如果未指定網絡,會以文件夾 + _default的規則自動創建一個名為redis_default的網絡(文件夾名為redis),該次創建的所有容器都會加入該網絡,其中的容器可以相互訪問。

常見問題

1.搭建集群的時候,一直是Waiting for the cluster to join.....
我最初的想法是docker是相互隔離的,所以每個node中的端口都可以使用默認的6379。最開始配置為:

  ports:
    - '7001:6379'     #服務端口
    - '17001:16379'   #集群端口

...

  ports:
    - '7006:6379'     #服務端口
    - '17006:16379'   #集群端口

其實這種配置有問題的。在啟動容器的時候雖然正常,但是集群的節點間是無法通信的。因為redis集群間的通信端口是10000+當前節點port,在組建集群時,每個容器中的node,端口都是6379,會通過16379訪問其他node,而容器映射的端口是17001不是16379,所以才會一直waiting。
2.Node 192.168.200.135:7002 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
刪除對應node中data下的內容即可,我這里是測試環境為了方便,刪除所有node下data的內,命令如下:
先停止容器,docker-compose down ,然后刪除所有節點data下的內rm -f /docker/redis/700{1..6}/data/*

參考:https://www.jianshu.com/p/b7dea62bcd8b


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM