Swarm 如何存儲數據?- 每天5分鐘玩轉 Docker 容器技術(103)
選項一:打包在容器裏。
顯然不行。除非數據不會發生變化,否則,如何在多個副本直接保持同步呢?
選項二:數據放在 Docker 主機的本地目錄中,通過 volume 映射到容器裏。
位於同一個主機的副本倒是能夠共享這個 volume,但不同主機中的副本如何同步呢?
選項三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,所有 Docker 主機 volume 將掛載到各個副本。
這是目前最佳的方案。volume 不依賴 Docker 主機和容器,生命周期由 storage provider 管理,volume 的高可用和數據有效性也全權由 provider 負責,Docker 只管使用。
我們將以 Rex-Ray 為例來實踐第三種方案。
Rex-Ray
Rex-Ray 是開源的容器存儲管理解決方案。支持主流的容器編排引擎 Docker Swarm、 Kubernetes 和 Mesos,為容器集群提供自動化的存儲編排功能。
在《每天5分鐘玩轉Docker容器技術》的數據管理章節中已經詳細討論了 Rex-Ray 如何跨 Docker 主機管理 data volume,本節內容也是建立在這些基礎知識之上。為節省篇幅,建議大家先閱讀這些內容,然後回到這裏繼續實踐。
我們將在部署如下的 Rex-Ray 實驗環境:
swarm 中的所有 node 都安裝部署 Rex-Ray。
Rex-Ray 使用 VirtualBox backend。
具體的安裝部署方法請參考前面 Docker 數據管理章節,這裏不再贅述。
實踐
接下來,我們將:
創建 httpd 服務,並使用 Rex-Ray data volume。
修改 volume 中的數據,並驗證更新同步到所有副本。
驗證 failover 發生時,更新的數據不會丟失。
創建 service
執行如下命令:
?
docker service create --name my_web \
? ? ? --publish 8080:80 \
? ? ? --mount "type=volume,volume-driver=rexray,source=web_data,target=/usr/local/apache2/htdocs" \
? ? ? httpd
?
--mount
?指定數據卷的?volume-driver
?為?rexray
。source
?指定數據卷的名字為?web_data
,如果不存在,則會新建。target
?指定將數據卷 mount 到每個副本容器的?/usr/local/apache2/htdocs
,即存放靜態頁面的目錄。
?
訪問 service:
權限有些問題,需要進容器修改 /usr/local/apache2/htdocs 的權限。
service 已經可以訪問了:
當前 Rex-Ray volume?web_data
?被掛載到 node?swarm-worker1
。
mount 到?/var/lib/libstorage/volumes/web_data/data
?目錄。
通過?docker inspect my_web.1.2j7dgzuyk9hodseej707t97su
?可以確認?/var/lib/libstorage/volumes/web_data/data
?已經映射到容器目錄?/usr/local/apache2/htdocs
當前的實驗環境如圖所示:
下一節我們驗證在故障情況 Volume 的持久性。
書籍:
1.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html
2.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html
Swarm 如何存儲數據?- 每天5分鐘玩轉 Docker 容器技術(103)