從零開始學習docker之在docker中搭建redis(集群)
docker搭建redis集群
docker-compose是以多容器的方式啟動,非常適合用來啟動集群
一、環境準備
雲環境:CentOS 7.6 64位
二、安裝docker-compose
#需要先安裝企業版linux附加包(epel) yum -y install epel-release #安裝pip yum -y install python-pip #安裝docker-compose pip install docker-compose
三、創建docker-compose.yml
以docker-compose啟動時會從當前路徑找docker-compose.yml或者docker-compose.yaml
從docker官網上找一份docker-compose.yml ,傳送門—————————————-//docs.docker.com/compose/compose-file/
docker-compose啟動單機redis
接下來先用docker-compose嘗試啟動單點redis,下面是docker-compose配置文件
#docker-compose版本
version: "3.8" services: # service實例名 redis: #容器服務名 container_name: redis-0 #基礎鏡像 image: redis #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6379:6379 - 16379:16379 #映射宿主機的數據卷 配置數據目錄和配置文件目錄 HOST:CONTAINER volumes: - /usr/docker/redis/data:/data - /usr/docker/redis/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf
同時需要配置redis.conf ,配置以及配置項的修改請移步上一篇博文——從零開始學習docker之在docker中搭建redis(單機)
配置好之後只需要在docker-compose.yml所在目錄執行
docker-compose up -d
啟動成功,連接redis與驗證同樣移步上一篇博文
docker-compose啟動redis集群
docker-compose.yml
#https://docs.docker.com/compose/compose-file/ #version version: "3.8" services: # 節點1 redis-1: #容器服務名 container_name: redis-1 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6381:6381 - 16381:16381 #映射宿主機的數據卷 配置數據目錄和配置文件目錄 HOST:CONTAINER volumes: - /usr/docker/redis-cluster/redis-6381/data:/data - /usr/docker/redis-cluster/redis-6381/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf # 節點2 redis-2: #容器服務名 container_name: redis-2 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6382:6382 - 16382:16382 #映射宿主機的數據卷 配置目錄 volumes: - /usr/docker/redis-cluster/redis-6382/data:/redis/data - /usr/docker/redis-cluster/redis-6382/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf # 節點3 redis-3: #容器服務名 container_name: redis-3 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6383:6383 - 16383:16383 #映射宿主機的數據卷 配置目錄 volumes: - /usr/docker/redis-cluster/redis-6383/data:/data - /usr/docker/redis-cluster/redis-6383/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf # 節點4 redis-4: #容器服務名 container_name: redis-4 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6384:6384 - 16384:16384 #映射宿主機的數據卷 配置目錄 volumes: - /usr/docker/redis-cluster/redis-6384/data:/redis/data - /usr/docker/redis-cluster/redis-6384/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf # 節點5 redis-5: #容器服務名 container_name: redis-5 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6385:6385 - 16385:16385 #映射宿主機的數據卷 配置目錄 volumes: - /usr/docker/redis-cluster/redis-6385/data:/redis/data - /usr/docker/redis-cluster/redis-6385/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf # 節點6 redis-6: #容器服務名 container_name: redis-6 #基礎鏡像 image: redis #網路 host模式 和宿主機公用 以便集群之中的其他機器互相通訊 network_mode: "host" #埠映射 #第一個埠是客戶端通訊埠 第二個埠為集群匯流排埠 用於失敗檢測以及故障轉移、選舉等 偏移量總是10000 ports: - 6386:6386 - 16386:16386 #映射宿主機的數據卷 配置目錄 volumes: - /usr/docker/redis-cluster/redis-6386/data:/redis/data - /usr/docker/redis-cluster/redis-6386/redis.conf:/etc/redis/redis.conf # 設置服務默認的啟動程式 entrypoint: - redis-server - /etc/redis/redis.conf
集群模式的redis.conf除了要改單機的幾個配置外(埠、本地訪問保護) 還需要修改集群配置。
#把這一行的#注掉 表示支援集群 cluster-enabled yes #集群配置文件(啟動時自動生成) cluster-config-file nodes_xxx.conf
同時需要配置網路 如果不配置的話默認時bridge模式 容器之間不能互相通訊,無法做集群。
在這裡我是把網路配置成host模式:network_mode: “host” 即容器和宿主機共享同一個網路,這樣容器與容器之間就可以互相通訊,詳見上面配置文件。
配置好之後通過docker-compose up -d執行
6個節點能啟動成功了 這個時候隨便進入一個節點開啟集群模式
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
可以看到開啟集群模式後默認分配了主從伺服器 選yes接受該配置
這時候主從伺服器都加入到集群中去了 到這裡集群就已經搭建好了
四、驗證redis集群
首先進入其中某一個節點
redis-cli -c -h 127.0.0.1 -p 6381
連接到redis之後可以通過cluster-nodes顯示集群節點分布情況
可以看到三主三從
redis6381節點 set值之後根據hash環分布 數據落在6382節點上
五、相關程式碼及配置文件
傳送門———————————-//github.com/DreamsChaser/docker
六、問題匯總
問題1
ERROR: for redis-master-1 Cannot start service redis-master-1: OCI runtime create failed: container_linux.go:349:
starting container process caused "exec: \"redis-server /etc/redis/redis.conf\": stat redis-server /etc/redis/redis.conf: no such file or directory": unknown
這種情況會好多種原因 可能是因為配置文件映射路徑有問題導致
我這出現的情況是因為我在寫 容器啟動的命令entrypoint時沒有按照yml的文件格式導致不識別所致
問題2
Node 127.0.0.1:6381 is not configured as a cluster node
未開啟集群模式,需要在redis.conf里開啟,具體見上面redis.conf配置