從零開始學習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配置