一、安裝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/*