1. 程式人生 > >docker-compose編排專案redis容器實現主從複製

docker-compose編排專案redis容器實現主從複製

一.pip管理工具安裝

  docker-compose是python專案,所以安裝需要通過python下的包管理工具pip安裝。一般linux伺服器都會預安裝有python環境,所以優先檢查python是否已經安裝,pip管理工具是否已經安裝

  

# wget https://bootstrap.pypa.io/get-pip.py    #下載pip指令碼
# python2.7 get-pip.py                 #將pip繫結到python2.7中
# pip install --upgrade pip        #更新pip
# pip install docker-compose==1.22    #安裝指定版本的docker-compose
# docker -v
Docker version 18.09.0

   當安裝docker-compose可能遇到一些錯誤提示,如:自動刪除request包失敗時可以通過pip install --ignore-installed request命令忽略安裝request包再安裝docker-compose

二.資料準備

  建立目錄如/workdir作為redis容器的工作目錄。在/workdir中建立redis-master.conf(主reids配置檔案)、redis-slave.conf(從reids配置檔案)、redis-master.sh(主容器的redis啟動指令碼)、redis-slave.sh(從容器的redis啟動指令碼)

  redis-master.conf主要配置如下:

  

################################## NETWORK #####################################
bind 0.0.0.0  
port 6379

################################## SECURITY ###################################
requirepass 1


################################# REPLICATION #################################
masterauth 1            #以防以後使用哨兵切換主節點後連線不到新主節點

   redis-slave.conf主要配置如下:

################################## NETWORK #####################################
bind 0.0.0.0
port 6379

################################## SECURITY ###################################
requirepass 1


################################# REPLICATION #################################
slaveof 172.20.0.2 6379      #指定主節點的ip
masterauth 1

   redis-master.sh程式碼如下:

#!/usr/bin/bash
redis-server /workdir/redis-master.conf

   redis-slave.sh程式碼如下:

#!/usr/bin/bash
redis-server /workdir/redis-slave.conf

 

   準備docker-compose編排檔案,由於當前docker引擎版本是18.09.0所以這裡version使用3.7版本

version: "3.7"
services:
  redis-master:
     image: redis
     container_name: redis-master
     stdin_open: true
     tty: true
     networks:
       redis:
         ipv4_address: 172.20.0.2
     volumes:
       - "/workdir:/workdir"
     expose:
       - "6379"
     command: ["/bin/bash","/workdir/redis.sh"]

  redis-slave:
     image: redis
     container_name: redis-slave
     stdin_open: true
     tty: true
     depends_on:
       - redis-master
     networks:
       redis:
         ipv4_address: 172.20.0.3
     volumes:
       - "/workdir:/workdir"
     expose:
       - "6379"
     command: ["/bin/bash","/workdir/redis.sh"]


networks:
  redis:
     driver: bridge
     ipam:
       driver: default
       config:
         - subnet: 172.20.0.0/16

 

 

  執行編排檔案。

# docker-compose up -d
Creating network "docker-compose_redis" with driver "bridge"
Creating redis-master ... done
Creating redis-slave  ... done
# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3f586ac5a1b8        redis               "/bin/bash /workdir/…"   11 seconds ago      Up 10 seconds       6379/tcp            redis-slave
354d20e933bf        redis               "/bin/bash /workdir/…"   11 seconds ago      Up 10 seconds       6379/tcp            redis-master

 

  備註:

  1.如果在編排檔案測試的過程中遇到error等錯誤,經重新編寫後不能馬上執行docker-compose up -d執行編排任務。因為之前的命令中很可能已經建立了指定的容器或網路等。需要執行 docker-compose down先停掉編排任務再執行 docker-compose up -d執行編排任務。

  2.寫編排檔案的時候曾經踩了一個大坑,容器建立完後使用bash指令碼啟動主、從redis服務時曾經嘗試公用一個配置檔案來啟動。後來一臺啟動成功一臺啟動不成功。經過docker logs redis-slave檢視日誌後發現是

 

':C 15 Dec 09:43:39.423 # Fatal error, can't open config file '/workdir/docker-compose/redis-master.conf

 

   經過測試發現當一個redis服務通過一個配置檔案啟動後會把該配置檔案的許可權修改並且在服務執行的過程中會主動根據環境配置(如:哨兵或客戶端設定環境變數時)的變動修改配置檔案的值。所以兩個redis服務不能共用一個配置檔案,需要獨立擁有自己的配置檔案。

  3.根據上面的道理,在容器的使用過程中,不同容器儘量不要共用同一個檔案或指令碼,儘量分開使用,儘管使用的指令碼內容一樣也不要自己去跳這些坑。