從零開始 Docker 搭建 Redis 集羣

從零開始 Docker 搭建 Redis 集羣

Docker 圖片

Docker 安裝

Docker 官方安裝說明地址linux

初識 Docker

  • 輕量,簡單的建模方式.
  • 爲雲計算而生.
  • 多平臺能夠移植,易於構建,易於協做.
  • 基礎設施即代碼:經過 Docker 的鏡像,咱們能夠將建立過程變爲自動和且可重複,並且能夠作版本管理.
  • 不可變基礎設施:對無狀態服務升級,部署會更爲容易和簡單,咱們無需再修改配置,只須要銷燬重建便可.
  • 配上 SOA 或 微服務架構,Docker 會更香.

Docker 的結構

Docker Archetecture

解釋一下上圖的幾個關鍵詞:redis

  • Client:這就是你所看到的 docker 控制終端.
  • DOCKER_HOST:這是 docker 運行的總體運行時上下文
  • Docker daemon:這是 Docker 的守護程序,由他來和 Client 進行通訊,獲取 Client 的命令,並對 Image Container 等組件進行統一管理.
  • Images:這是一切容器運行的模板或者是基礎,容器都是經過 image 來建立的.
  • Containers:由 Image 所建立的運行實例,程序都運行在容器中,一個 Image 能夠擴展出 N 個 Container
  • Docker Registry: Docker Image 的存放庫,通常狀況下都是使用官方的 DockerHub.com.不過,你也能夠搭建本身的 Docker Registry 將 Image 管理私有化.

Docker Container

Docker 安裝成功後,請你在命令行中使用docker info來確認 Docker 是否正確的安裝在本地環境中.docker

啓動你的第一個 Container

docker run -t -i ubuntu /bin/bashshell

若是,啓動成功的話,你會看到你的命令行變成ubuntu

root@c8fabbcb9f8a:/#vim

@符號後面的這串字符可能和個人不太同樣,他們都是隨機生成的容器 IDbash

你能夠嘗試在 Container 終端中使用 ps aux,hostname,ip a等命令,來體會容器的便利性.網絡

你還能夠在 Container 中安裝你所須要的工具,你可使用 apt-get update && apt-get install vim來給他安裝 vim.架構

請你記住,只要不是在 Image 中所包含的,當 Container 被 Remove 後,這一切都將不復存在.微服務

接着,咱們來一個個解釋命令是什麼意思:

  • docker run :讓 docker 啓動一個容器的命令.
  • -t:建立一個虛擬的 TTY 終端.
  • -i:表明咱們建立的 Container 是會被捕獲 STDIN 的.
  • ubuntu:這是咱們啓動 Container 所對應的 Image,若是須要指定版本的話能夠經過 ubuntu:18.04 這種方式.
  • /bin/bash:這是當 Container 啓動完成後,就會執行這個命令.

最後,輸入exit接上回車來中止這個終端.這時候你會退回到你本身的操做系統終端中,那咱們怎麼去看剛剛建立的容器去哪裏了呢.

輸入docker ps -a

你會看到下面這樣的內容

CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS                     PORTS                    NAMES
c8fabbcb9f8a        ubuntu                 "/bin/bash"              7 seconds ago       Exited (0) 4 seconds ago                            elated_banzai

複製代碼

咱們能夠經過這些發現不少有用的信息:

  • CONTAINER ID:咱們以前 tty 裏面看到的容器 ID.
  • IMAGE: Container 所使用的容器.
  • COMMAND: Container 啓動後所使用的命令.
  • CREATED: Container 建立的時間.
  • STATUS: Container 目前的狀態.
  • PORTS: Container 所暴露出內部的端口,不過咱們這個實例沒有,後面的實例中咱們會看到的具體的操做和概念.
  • NAMES:Container 的名字,咱們能夠在 container run 的時候經過--name 指定名字,若是沒有指定,那麼 docker 會自動生成一個名字.

查看 Container

docker ps,docker container ls這 2 個命令有一樣的結果,就是查看當前正在運行的 Containers.若是,須要查看全部的容器,須要在命令後面加上-a

重啓已經中止的 Container

docker start elated_banzai或者docker start c8fabbcb9f8a

docker start 命令後面跟上 container 的 name 或者 id 均可以從新啓動它.

可是,咱們會發現此次啓動之後,咱們沒有進入終端,可是查看最新的狀態,他倒是 UP 的狀態.這是爲何呢

由於,咱們此次只是重啓了 Container,可是並無經過 tty 鏈接到這個容器上去.

那咱們還想鏈接回去怎麼辦呢,下面咱們會講到

經過 tty 鏈接運行中的 Container

docker exec -i -t elated_banzai /bin/bash

固然,上面使用 Container name 的地方也能夠互換爲 Container id.在 docker 命令中,全部指定 Container 的地方,都是 nameid 能夠互換的.

這個命令比較簡單,與 docker run基本上是相似的,這裏就不作展開講解了.

Container 輸出的查看

首先,咱們下面的命令,來建立一個叫 log_container 的 Container

docker run -d --name log_container ubuntu /bin/sh -c "while true;do echo hello world; sleep 3; done"

這時,可能你會發現,這條命令裏面多了一個 -d的配置,他是用來指定使用 daemon 的模式來運行這個 Container.

咱們在最後寫了一個死循環的 shell 腳本,讓他每 3 秒輸出一個 hello world.

回車之後,他只是輸出了這個 container 的 id,咱們能夠經過下面的命令結合 id或者 name來看輸出的內容.

docker logs log_container

添加-f來持續查看他的輸出,這個和 linux 中的 tail 命令是相似的.

咱們還能夠添加-t來查看輸出的時間戳.

查看 Container 內部的進程

docker top name/id

查看全部 Containers 或者指定的 Container 的統計信息

docker stats,docker stats ContainerName1 ContainerName2...

中止 Container

docker stop name/id

刪除 Container

docker rm name/id

這個命令若是不添加-f,那咱們只能刪除已經中止的容器.

深刻查看 Container 信息

docker inspect name/id

這個命令顯示的內容比較多,不過大部分都能經過keyname看懂,若是有不清楚的部分請自行查閱相關文檔.

Image

查看 Images

docker images,docker image ls

刪除 Image

docker images

Dockerfile

Dockerfile 是一個使用基本的 Docker DSL 語法的指令來構建 Docker Image 的文件. 經過,Dockerfile來構建 Image ,更具有重複性,透明性和冪等性.

基礎理論基本上介紹的差很少了,那麼咱們直接上乾貨.

用 Docker 搭建一個 redis cluster

建立 replica Base Image

首先,咱們建立 Redis 的主鏡像

$ mkdir redis-replica
$ cd redis-replica
$ touch Dockerfile
複製代碼

Dockerfile:

#使用的母鏡像
FROM redis
#維護者信息,這裏填的是我本身的郵箱
MAINTAINER crowhyc@163.com
#環境變量,添加之後能夠在容器和接下來的命令裏面均可以使用
#這個環境變量是用於定義這個鏡像的版本和日期
ENV REFESHED_AT 2020-04-01
#用來向基於Image建立的 Container 添加捲
#一個卷是能夠存在於一個或多個 Container 內特定的目錄,這個目錄能夠共享數據或對數據進行持久化功能
#下面這個 VOLUME 會在 Container 裏面建立這 2 個目錄
VOLUME ["/var/lib/redis","/var/log/redis/"] #基於此 Image 建立的 Container 會對外暴露 6379 接口
#能夠經過 docker ports name/id 來查詢 Container 暴露接口與本地接口所映射的關係
#也能夠在 Container docker run 的時候經過-p 6379:6379 把他綁定到指定的 port 上
EXPOSE 6379
#用於指定一個 Container 啓動時要運行的命令,相似於後面會遇到的 RUN 命令
#只是 RUN 指令是指定 Image 被構建時須要運行的命令
#docker run 命令能夠覆蓋 CMD 命令,這裏留空的目的是讓 docker run 的時候能夠自定義須要執行的命令
#後面介紹到的 ENTRYPOINT 命令則不能夠被覆蓋
CMD [] 複製代碼

保存文件後,咱們運行下面的這條命令

docker build -t crowhyc/redis-replica:1.0 .

咱們來解釋一下這條命令

docker build是用來建立鏡像的.

-tcrowhyc/redis-replica:1.0是用來代表後面咱們會用這種格式的方式來指定 Image 的名稱和版本.

最後,還有一個不起眼的.這個是用來指定 Dockerfile 的地址..是說明 Dockerfile 就在當前目錄下

咱們不會 run 這個 Image.它是接下來咱們 redis-primary 和 redis-slave 的母鏡像

建立 redis primary Image

$ mkdir redis-primary
$ cd redis-primary
$ touch Dockerfile
複製代碼
FROM crowhyc/redis-primary:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#是 Container 啓動之後執行的命令,與 CMD 不一樣,Container 啓動的命令不能覆蓋它
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log"] 複製代碼

緊接着,咱們建立 redis 的主鏡像

docker build -t crowhyc/redis-primary:1.0 .

建立 redis slave Image

$ mkdir redis-slave
$ cd redis-slave
$ touch Dockerfile
複製代碼
FROM crowhyc/redis-replica:1.0
MAINTAINER crowhyc "crowhyc@163.com"
ENV REFRESHED_AT 2020-04-01
#這裏有一點須要注意的是,咱們第三個參數使用的是 redis-primary 當咱們啓動 primary Container 的時候須要與這個名字相同
ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log","--slaveof redis-primary 6379"] 複製代碼

啓動 redis cluster 並查看狀態

建立 Network

docker network create redis-cluster

首先,咱們使用上面的命令建立一個新的 network.

docker network是 docker Container 之間用來通訊的網絡,用戶能夠本身建立網絡,用來組件本身的集羣網絡.

docker network ls

一樣,咱們也能夠用上面的命令來查看全部的網絡

啓動 redis-primary

接着,咱們使用下面的docker run來啓動咱們的 primary redis server.

docker run -d -h redis-primary --net redis-cluster --name reids-primary crowhyc/redis-primary:1.0

-h是一個以前沒有出現過的新標誌,他用來設置 Container 的 hostname,這會覆蓋默認的行爲即將 Container 主機名設置爲 ContainerId.

使用這個標誌能夠保證redis-primary被做爲 Container 的 hostname,並被本地的 DNS 服務正確解析.

--net是用來設定這個 Container 所使用的 Network

查看 redis-primary 日誌

咱們輸入 docker logs 命令去查看日誌

docker logs -f redis-primary

稍做等待,你會發現--根本什麼都沒有...那這是爲何呢?

這是由於咱們在作 redis-primary 的時候,讓日誌記錄到了/var/log/redis/redis-server.log 這個文件裏面.

接着,咱們用更加巧妙的方式去觀察相似這種狀況下的日誌輸出.

docker run -it --rm --volumes-from redis-primary ubuntu cat /var/log/redis/redis-server.log

這下咱們就能看到對應的 redis-primary 的日誌了,若是出現了Ready to accept connections說明 redis-primary已經啓動成功.

接着咱們來爲他啓動 2 個 redis-slave

啓動多個 redis-slave

docker run -d -h redis-slave01 --net redis-cluster crowhyc/redis-slave:1.0 docker run -d -h redis-slave02 --net redis-cluster crowhyc/redis-slave:1.0

接着咱們用上面剛剛學的 docker run 來觀察 slave 是否和 primary 創建了聯繫 docker run -it --rm --volumes-from redis-slave01 ubuntu cat /var/log/redis/redis-server.log docker run -it --rm --volumes-from redis-slave02 ubuntu cat /var/log/redis/redis-server.log

若是,咱們能看到相似於MASTER <-> REPLICA sync: Finished with success這樣的日誌,說明咱們 slave 與 primary 已經鏈接成功了 接下來,咱們用 docker 的方式來測試 redis 吧

簡要 redis 集羣測試

docker run -it --rm --net redis-cluster redis /bin/bash 緊接着咱們鏈接到 redis-primary

redis-cli -h redis-primary

而後,咱們 SET 一個值

redis-primary:6379> set "test" 1234

接着,咱們再進入 redis-slave01

docker exec -it redis-slave01 /bin/bash

redis-cli -h localhost

get "test"

若是,咱們在執行完get命令後看到了"1234"說明咱們的 redis 集羣已經完成搭建了.

相關文章
相關標籤/搜索