docker-compose編排項目redis容器實現主從複製

一.pip管理工具安裝python

  docker-compose是python項目,因此安裝須要經過python下的包管理工具pip安裝。通常linux服務器都會預安裝有python環境,因此優先檢查python是否已經安裝,pip管理工具是否已經安裝linux

  

# 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-composeredis

二.資料準備docker

  建立目錄如/workdir做爲redis容器的工做目錄。在/workdir中建立redis-master.conf(主reids配置文件)、redis-slave.conf(從reids配置文件)、redis-master.sh(主容器的redis啓動腳本)、redis-slave.sh(從容器的redis啓動腳本)bootstrap

  redis-master.conf主要配置以下:bash

  

################################## 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代碼以下:python2.7

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

 

   準備docker-compose編排文件,因爲當前docker引擎版本是18.09.0因此這裏version使用3.7版本tcp

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

相關文章
相關標籤/搜索