天天看點

docker 單機配置redis主從叢集 叢集 前置準備前置準備1. 了解docker image和container2. 了解docker持久化:docker volume和bind mount3. docker 網絡機制4. 安裝docker并順利拉取鏡像5. 學會使用docker GUI: Kitematic6. 部署redis

前置準備

該文是docker redis主從配置 正式部署的前言。如下會簡要列出目錄,需要了解的前置知識,以防配置時出錯。

如果你還不夠了解,就閱讀正文的相應章節。

  1. 了解docker image和container

    10張圖深入了解Docker容器和鏡像

    • image是多個read layer的堆疊
    • 而container是在image上添加一層read-write layer。
  2. 了解docker持久化:docker volume和bind mount

    docker volume 容器卷的那些事(一)

    • docker volume是推薦的持久化方法,以單個volume檔案存儲,易于移植。
    • bind mount是将主控端的目錄挂載到容器目錄下,易于在主控端操作。
  3. 了解docker網絡機制:host和bridge

    docker之網絡配置

    • host可将容器的網絡空間與主控端綁定。
    • bridge(預設)可用網橋将各個容器與主控端連接配接。
  4. 安裝docker并順利拉取鏡像
  5. 學會使用docker GUI: Kitematic
  6. 了解redis部署

1. 了解docker image和container

這一章沒有什麼可講的,關于鏡像和容器的拉取、删除等操作,可自行查閱,無需贅談。

記錄一個操作,檢視各個image、container的容量:

docker system df -v

2. 了解docker持久化:docker volume和bind mount

容器隻是在鏡像上覆寫一層read layer,任何修改都在改層上進行。

但有時候,我們想對容器的資料進行持久化,甚至想要将其遷移到其它容器内。比如,将一個容器内的資料庫進行備份,複制到另一個機器,挂載到容器中使用,就要使用持久化了。

有三種可以對容器資料進行持久化,如下圖所示:

  1. bind mount 将主控端的目錄挂載到容器目錄下。
  2. volume 将主控端上的volume檔案挂載到容器目錄下。官方推薦用此方式。
  3. tmpfs mount 此處略。
在redis的DockerFile中,用到了

VOLUME /data

,建立一個卷,并挂載到

/data

上。

如果想要進行遷移,可參考Docker中Image、Container與Volume的遷移

2.1 volume

參考DOCKER檢視挂載目錄VOLUME

  1. 可以将volume檔案挂載到容器下,也可以可以複制到别的機器上挂載,做到即插即用。

    當容器删除時,其使用的volume檔案不會跟随删除。

  2. 要删除無用的volume,可運作

    docker volume prune

    。該指令隻會删除"無主"的volume,若某volume所挂載的容器處于關閉狀态,并不會被删除。

檢視容器使用volume的情況:

可以運作

docker inspect -f "{{.Mounts}}" {container}

,其中{container}為容器的名字或id。

輸出案例如下:

VOLUME /data

dockerHub的redis官方給出的DockerFile中有一句

VOLUME /data

,表示建立一個volume并挂載到

/data

目錄。

3. docker 網絡機制

docker有四種網絡模式:bridge、host、container、none。在本次部署中,隻用到預設的bridge模式,其它模式可查閱docker之網絡配置。

最左邊的容器為host模式,右邊兩個容器為bridge模式

  • 該模式下容器與主控端不在同一網段,容器會被配置設定一個私有ip,一般是

    172.17.0.x

  • Docker采用 NAT 方式,将容器的port與主控端的port綁定。外界、主控端可通路綁定在主控端上的port,來通路容器。
  • 每個容器都視為網絡中一個主體,是以

    127.0.0.1

    是回環位址,隻是指向容器自身,不能通路到主控端。
  • 容器不是虛拟機,是以bridge模式下,主控端是無法ping通容器的。但通過端口可以通路對應服務。

在正式部署叢集時,我們需要在主伺服器容器中先運作

ifconfig

檢視它的ip,這樣此ip才能被從伺服器識别。在從伺服器的

redis.config

中,

slaveof {ip} 6379

一行中的{ip}就是填寫此ip。

root@a2682b89400a:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ...
collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        ...        
collisions 0           

複制

  • eth0中的

    172.17.0.2

    就是容器的私有ip,主控端上的其它容器可通過該ip互相識别,從伺服器的容器可用此類ip找到主伺服器的容器。
  • lo是本地回環,說明

    127.0.0.1

    指向自己。

4. 安裝docker并順利拉取鏡像

4.1 安裝docker

windows安裝docker的步驟比較簡單,百度即可。

值得一提的是,安裝過程中docker可能會請求建立賬戶,一路同意即可,否則可能報錯。

4.2 拉取鏡像

  1. 如果由于長城的緣故,拉取太慢,或者無法拉取,可以 右鍵docker圖示->settings->daemon->registry mirrors 中加上

    https://registry.docker-cn.com

    設定鏡像。
  2. 如果還是出現了錯誤:Error response from daemon: Get https://registry-1.docker.io/v2/,可以
    1. 将主控端ipv4的首要dns改為8.8.8.8,次要dns改為8.8.8.4。
    2. 然後在 右鍵docker圖示->settings->network->dns server中改為"fixed 8.8.8.8"
    3. 确認沒有使用代理等其它網絡配置

4.3 設定目錄映射

在部署中,我們需要将主控端的

redis.conf

配置映射到容器中,供redis伺服器啟動使用。

假設這些配置檔案在d盤,我們就要将d盤共享。操作如下:

右鍵docker圖示->settings->shared drives->在d盤處打鈎->點選apply

docker可能會請求操作d盤的權限,之後需要你輸入賬戶密碼(如果沒有就設定一個),一并照做即可。

5. 學會使用docker GUI: Kitematic

建議安裝docker的GUI,Kitematic。它有很多實用的功能,能簡化你很多工作,比如運作shell、綁定容器端口到主控端上,等等。

安裝方法:右鍵docker圖示->單擊Kitematic,按照訓示操作即可。

這裡貼出兩張效果圖:

6. 部署redis

我們可以參閱docker redis官方給出的指令來運作。在主從配置中,需要自己定義

redis.conf

來配置,是以官網的這一條指令會有用:

docker run -v /myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf --name myredis redis redis-server /usr/local/etc/redis/redis.conf

  1. 這條指令會把主控端的

    /myredis/conf/redis.conf

    映射到容器的

    /usr/local/etc/redis/redis.conf

    中,然後

    redis-server /usr/local/etc/redis/redis.conf

    會調用配置檔案。
  2. 這條指令不夠完美。如果正确編寫了

    redis.conf

    ,你用以上指令可以順利完成主從配置,但可能會看見"WARNING"。在正式部署中會講解決方法,也就是該指令需要加一些别的參數。
指令中的

-v

參數會把主控端的檔案或目錄挂載到容器中。由于是挂載,不是拷貝,每次容器重新開機時,該檔案/目錄需要正确存在路徑上。如果路徑上不存在檔案/目錄,docker會建立一個空的端點,讓其順利運作。