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