〖原創〗使用Docker過程中注意事項之壹(文章末尾有彩蛋!)

0?wx_fmt=jpeg

(圖片來源於網絡)

本寶寶以技術棧Redis爲例,列舉並解釋了一些面向Docker進行應用程序開發和系統搭建中所需要注意的問題和技巧,以及Caicloud平臺在Docker管理和幫助企業應用向Docker轉化中的作用。由於應用程序千差萬別,應用場景層出不窮,本文僅起到拋磚引玉的作用。


我們總結基於Docker的Redis組件的使用注意事項如下:

0?wx_fmt=png

(圖片來源於網絡)

Redis的外部存儲掛載                                                                

  1. Persistence被開啓:無論是RDB還是AOF模式,都會需要在硬盤上進行存儲。以RDB爲例,會自動存在本地硬盤一個叫dump.rdb的文件。如果沒有掛載外部存儲,這些數據在docker銷燬後會消失。

  2. 主從設置下Replication對硬盤的需求:在Redis 2.8以前,Master與Slave的同步需要用存儲(硬盤)作爲中間媒介(自2.8此同步可不經過硬盤,但還屬於試驗內容)。在Docker環境下需要掛載Volume以保證這個步驟能正常運行。


Redis不能跑在daemonize的模式                                                

Docker的容器需要其中的主進程一直在前端運行,使用daemonize的模式會使得container在運行後立即退出。幸運的是在Redis的配置文件中daemonize模式默認被關閉。如需運行daemon模式,應該在docker層面通過-d命令來進行。


Redis的日誌文件目錄應置爲空                                                  

Docker的容器所產生的日誌會被系統自動接收和管理;同時Caicloud的集羣管理平臺更會監測和聚合系統中所有容器的日誌。因此在配置文件中將logfile設爲空會享受Docker和Caicloud的自動日誌收集和管理。


Redis Snapshot的注意事項                                                      

1、在主從結構下Snapshot應開啓:如果在Redis的Master節點上配置了Persistenceoff (數據不會自動存儲到硬盤上),那麼我們同時還應該關掉Master節點的自動重啓功能。由於Caicloud的自動修復功能會重啓實效的容器(包括RedisMaster),我們應開啓Snapshot功能。

2、對Persistence的需求:Redis會把Snapshot產生的rdb文件寫在指定的目錄中。默認情況下這個對應在Docker內部的一個目錄,會隨着Docker的銷燬而銷燬。如果有Persistence的需求,應該在生成Dockerfile和運行Redis容器時同時掛載外部的存儲。


Redis的端口映射                                                                        

Docker的容器在運行時默認會將容器內的應用端口映射成一個隨機的主機端口,但這樣會打破一些Redis服務。比如sentinel需要根據默認端口規則 (26379) 來進行自動發現。因此在Docker下運行Redis一定要使用 –p port:port的格式來明確使用默認的Redis端口規則。


Redis主從結構中的Master節點的發現                                        

在主從結構中,從節點(slave)需要在配置文件中使用Master節點的IP,來實現與Master節點的互連。傳統架構中這個IP可以預先通過靜態綁定。在Caicloud體系中,系統不需要靜態綁定具體的IP地址,而是可以通過DNS動態地發現,並通過運行Docker時的CMD命令來使用特定的腳本將Master IP動態添加到配置中。


多個Redis集羣共存的情況                                                          

Caicloud下不會出現兩個Redis Cluster混爲一起(https://www.oschina.net/news/67037/container-redis-accident)的情況,因爲Caicloud的獨特網絡特性(扁平化,每個機器有自己的網段)。如例子中提到的兩個Redis 集羣混在一起需要如下條件:

  • 在某一個物理機上運行來自兩個Redis 集羣的server 實例(from cluster A and cluster B);

  • 在兩個Redis 集羣中存在兩個server 實例(from cluster A and cluster B)碰巧有同樣的IP(在純Docker環境下有可能,因爲每個主機上的Docker會隨機分配網段和IP)

      在Caicloud環境下,每個Redis server都會被分配一個不同的IP,每兩個Redis server 的IP必定不相同(每個機器有自己的網段,所以不同機器上的Docker在給container分配地址的時候不會撞車)。


注:Caicloud內測版本即將在1月底上線,屆時可聯繫[email protected]獲取邀請碼,在Caicloud官網www.caicloud.io註冊用戶搶先體驗(邀請碼會在1月底逐批對外發放,對Caicloud有興趣的小夥伴一定不要錯過)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章