前置準備
該文是docker redis主從配置 正式部署的前言。如下會簡要列出目錄,需要了解的前置知識,以防配置時出錯。
如果你還不夠了解,就閱讀正文的相應章節。
-
了解docker image和container
10張圖深入了解Docker容器和鏡像
- image是多個read layer的堆疊
- 而container是在image上添加一層read-write layer。
-
了解docker持久化:docker volume和bind mount
docker volume 容器卷的那些事(一)
- docker volume是推薦的持久化方法,以單個volume檔案存儲,易于移植。
- bind mount是将主控端的目錄挂載到容器目錄下,易于在主控端操作。
-
了解docker網絡機制:host和bridge
docker之網絡配置
- host可将容器的網絡空間與主控端綁定。
- bridge(預設)可用網橋将各個容器與主控端連接配接。
- 安裝docker并順利拉取鏡像
- 學會使用docker GUI: Kitematic
- 了解redis部署
1. 了解docker image和container
這一章沒有什麼可講的,關于鏡像和容器的拉取、删除等操作,可自行查閱,無需贅談。
記錄一個操作,檢視各個image、container的容量:
docker system df -v
2. 了解docker持久化:docker volume和bind mount
容器隻是在鏡像上覆寫一層read layer,任何修改都在改層上進行。
但有時候,我們想對容器的資料進行持久化,甚至想要将其遷移到其它容器内。比如,将一個容器内的資料庫進行備份,複制到另一個機器,挂載到容器中使用,就要使用持久化了。
有三種可以對容器資料進行持久化,如下圖所示:
- bind mount 将主控端的目錄挂載到容器目錄下。
- volume 将主控端上的volume檔案挂載到容器目錄下。官方推薦用此方式。
- tmpfs mount 此處略。
在redis的DockerFile中,用到了,建立一個卷,并挂載到
VOLUME /data
上。
/data
如果想要進行遷移,可參考Docker中Image、Container與Volume的遷移
2.1 volume
參考DOCKER檢視挂載目錄VOLUME
-
可以将volume檔案挂載到容器下,也可以可以複制到别的機器上挂載,做到即插即用。
當容器删除時,其使用的volume檔案不會跟随删除。
- 要删除無用的volume,可運作
。該指令隻會删除"無主"的volume,若某volume所挂載的容器處于關閉狀态,并不會被删除。docker volume prune
檢視容器使用volume的情況:
可以運作
docker inspect -f "{{.Mounts}}" {container}
,其中{container}為容器的名字或id。
輸出案例如下:
VOLUME /data
:
dockerHub的redis官方給出的DockerFile中有一句
,表示建立一個volume并挂載到
VOLUME /data
目錄。
/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中的
就是容器的私有ip,主控端上的其它容器可通過該ip互相識别,從伺服器的容器可用此類ip找到主伺服器的容器。172.17.0.2
- lo是本地回環,說明
指向自己。127.0.0.1
4. 安裝docker并順利拉取鏡像
4.1 安裝docker
windows安裝docker的步驟比較簡單,百度即可。
值得一提的是,安裝過程中docker可能會請求建立賬戶,一路同意即可,否則可能報錯。
4.2 拉取鏡像
- 如果由于長城的緣故,拉取太慢,或者無法拉取,可以 右鍵docker圖示->settings->daemon->registry mirrors 中加上
設定鏡像。https://registry.docker-cn.com
- 如果還是出現了錯誤:Error response from daemon: Get https://registry-1.docker.io/v2/,可以
- 将主控端ipv4的首要dns改為8.8.8.8,次要dns改為8.8.8.4。
- 然後在 右鍵docker圖示->settings->network->dns server中改為"fixed 8.8.8.8"
- 确認沒有使用代理等其它網絡配置
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
- 這條指令會把主控端的
映射到容器的/myredis/conf/redis.conf
中,然後/usr/local/etc/redis/redis.conf
會調用配置檔案。redis-server /usr/local/etc/redis/redis.conf
- 這條指令不夠完美。如果正确編寫了
,你用以上指令可以順利完成主從配置,但可能會看見"WARNING"。在正式部署中會講解決方法,也就是該指令需要加一些别的參數。redis.conf
指令中的 -v
參數會把主控端的檔案或目錄挂載到容器中。由于是挂載,不是拷貝,每次容器重新開機時,該檔案/目錄需要正确存在路徑上。如果路徑上不存在檔案/目錄,docker會建立一個空的端點,讓其順利運作。