原本應該續以前那篇博客Docker配置redis哨兵模式——多服務器·上寫一個下篇的,可是突然意識到應該將必要的環境打包爲一個基礎鏡像,在此基礎上創建與redis有關的鏡像,這樣既可以快速打包,又可以高度複用代碼。html
因此本篇實際上至關於一個完整的多服務器使用Docker來部署Redis哨兵模式的過程。linux
由於個人服務器又是新租(日租)的,因此要從新恢復一下。c++
三臺服務器(由於須要至少三個哨兵保證安全性)redis
逐行執行如下指令:docker
# 1. 更新編譯環境 yum -y install gcc # 2. 同上 yum -y install gcc-c++ # 3. 安裝docker # 3.1 卸載舊版本 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 3.2 安裝須要的安裝包 yum install -y yum-utils # 3.3設置鏡像的倉庫,推薦使用國內的鏡像,比較快 yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 3.4 更新yum軟件包索引,功能是將軟件包緩存在本地一份 yum makecache # 3.5 安裝docker相關的 docker-ce 社區版 yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.1.el7.x86_64.rpm # 3.6 安裝 yum install docker-ce docker-ce-cli containerd.io # 3.7 啓動docker systemctl start docker # 3.8 設置爲後臺啓動 systemctl enable docker # 3.9 使用docker version查看是否按照成功 docker version # 3.10 測試(能夠不作) docker run hello-world # 3.11 卸載刪除(僅供參考,本次不作) yum remove docker-ce docker-ce-cli containerd.io rm -rf /var/lib/docker # 4. 配置加速器 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://qdxc3615.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
docker倉庫中的centos鏡像很是簡單,缺乏一些功能,不方便咱們安裝和調試,因此咱們把與redis自己無關但有助於咱們使用的部分打包成一個經常使用的基礎鏡像。shell
主要安裝的是vim編輯器和procps(查看容器內運行的進程)因此建立一個目錄爲basecentos,在其中建立並編寫Dockerfile以下:json
# 建立Dockerfile vi Dockerfile # 如下全部代碼爲Dockerfile的內容 FROM redis MAINTAINER blue<blue@email.com> # 安裝一些環境 RUN apt-get update RUN apt-get install -y vim RUN apt-get install procps --assume-yes
保存Dockerf後能夠建立名爲base-centos的鏡像,之後就能夠直接從這個鏡像生成新的容器,不須要一直下載。步驟以下:vim
docker build -t base-centos . # 查看現有的鏡像: [root@docker001 baseimage]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE base-centos latest 646e329bb8db 2 minutes ago 157MB # 使用docker login 登陸本身的docker帳號
將它push到咱們的dockerhub上,再在另外兩個服務器上pull下來,如今三個服務器上都有這個鏡像啦,我給他起的名字叫lanblue/mygoodcentos。centos
咱們使用的服務器是服務器1和服務器2。緩存
TIPS: 對於xshell可使用右鍵選擇發送鍵輸入到全部會話,這樣就不須要配置兩遍了。或者使用scp語句將配置好的文件共享給其餘服務器:
# scp local_file remote_username@remote_ip:remote_folder scp redis.conf root@58.131.71.196:/blue/redis02
cd / mkdir blue && cd blue mkdir redis01 && cd redis01
FROM lanblue/mygoodcentos MAINTAINER blue<blue@email.com> COPY redis.conf /usr/local/etc/redis/redis.conf VOLUME ["/data1"] WORKDIR /etc/redis # 開放端口7000 EXPOSE 7000 # 使用配置文件啓動 CMD [ "redis-server", "/usr/local/etc/redis/redis.conf"]
# 註釋掉bind 127.0.0.1 # bind 127.0.0.1 port 7000 # 這裏若是是yes會影響使用配置文件啓動 daemonize no pidfile /var/run/redis_7000.pid # 須要設置如下兩處密碼,密碼要一致 requirepass testmaster123 masterauth testmaster123 # 修改保護模式,若是是yes會致使外部服務器沒法訪問 protected-mode no # 對於服務器2,還須要加上一句,表示是服務器1的從服務器 # slaveof 主.機.I.P 端口 slaveof 123.57.234.161 7000
# 建立鏡像 docker build -t myredis . # 啓動容器 docker run -d -p 7000:7000 --name redis-test myredis # 進入容器內部 docker exec -it redis-test /bin/bash # 查看容器內進程 ps -ef
root@9692ae0ac72c:/etc/redis# redis-cli -p 7000 127.0.0.1:7000> auth testmaster123 OK 127.0.0.1:7000> info replication
在/blue下建立文件夾sentinel01。其內存放Dockerfile和sentinel.conf文件。
FROM lanblue/mygoodcentos MAINTAINER blue<blue@email.com> COPY sentinel.conf /usr/local/etc/redis/sentinel.conf # VOLUME ["/data2"] # 開放端口17000 EXPOSE 17000 # 使用配置文件啓動 CMD [ "redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
port 17000 sentinel monitor mymaster 123.57.234.161 7000 2 sentinel auth-pass mymaster testmaster123 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 sentinel deny-scripts-reconfig yes # 設置爲no纔會被其餘主機發現 protected-mode no
# 建立鏡像 docker build -t mysentinel . # 啓動容器 docker run -d -p 17000:17000 --name sentinel-test mysentinel # 進入容器內部 docker exec -it sentinel-test /bin/bash # 訪問17000端口 redis-cli -p 17000 # 查看哨兵狀況 # 如下是端口返回的信息 # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=123.57.234.161:7000,slaves=1,sentinels=4 # 哨兵節點會自動發現其餘哨兵,若是某些哨兵線程已經失效了,能夠用下列語句更新 127.0.0.1:17000> SENTINEL RESET * (integer) 1