1. 程式人生 > >docker-compose編排項目redis容器實現主從復制

docker-compose編排項目redis容器實現主從復制

錯誤 def down volume 切換 docker dep ner png

一.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.根據上面的道理,在容器的使用過程中,不同容器盡量不要共用同一個文件或腳本,盡量分開使用,盡管使用的腳本內容一樣也不要自己去跳這些坑。

docker-compose編排項目redis容器實現主從復制