Swarm 如何存儲數據?- 天天5分鐘玩轉 Docker 容器技術(103)

service 的容器副本會 scale up/down,會 failover,會在不一樣的主機上建立和銷燬,這就引出一個問題,若是 service 有要管理的數據,那麼這些數據應該如何存放呢?html

選項一:打包在容器裏。node

顯然不行。除非數據不會發生變化,不然,如何在多個副本直接保持同步呢?web

選項二:數據放在 Docker 主機的本地目錄中,經過 volume 映射到容器裏。docker

位於同一個主機的副本卻是可以共享這個 volume,但不一樣主機中的副本如何同步呢?apache

選項三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,全部 Docker 主機 volume 將掛載到各個副本。ide

這是目前最佳的方案。volume 不依賴 Docker 主機和容器,生命週期由 storage provider 管理,volume 的高可用和數據有效性也全權由 provider 負責,Docker 只管使用。spa

咱們將以 Rex-Ray 爲例來實踐第三種方案。code

Rex-Ray

Rex-Ray 是開源的容器存儲管理解決方案。支持主流的容器編排引擎 Docker Swarm、 Kubernetes 和 Mesos,爲容器集羣提供自動化的存儲編排功能。htm

在《天天5分鐘玩轉Docker容器技術》的數據管理章節中已經詳細討論了 Rex-Ray 如何跨 Docker 主機管理 data volume,本節內容也是創建在這些基礎知識之上。爲節省篇幅,建議你們先閱讀這些內容,而後回到這裏繼續實踐。blog

咱們將在部署以下的 Rex-Ray 實驗環境:

526.png

  1. swarm 中的全部 node 都安裝部署 Rex-Ray。

  2. Rex-Ray 使用 VirtualBox backend。

  3. 具體的安裝部署方法請參考前面 Docker 數據管理章節,這裏再也不贅述。

實踐

接下來,咱們將:

  1. 建立 httpd 服務,並使用 Rex-Ray data volume。

  2. 修改 volume 中的數據,並驗證更新同步到全部副本。

  3. 驗證 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

 

  1. --mount 指定數據卷的 volume-driver 爲 rexray

  2. source 指定數據卷的名字爲 web_data,若是不存在,則會新建。

  3. target 指定將數據卷 mount 到每一個副本容器的 /usr/local/apache2/htdocs,即存放靜態頁面的目錄。

527.png

 

訪問 service:

528.png

權限有些問題,須要進容器修改 /usr/local/apache2/htdocs 的權限。

529.png

service 已經能夠訪問了:

530.png

當前 Rex-Ray volume web_data 被掛載到 node swarm-worker1

531.png

mount 到 /var/lib/libstorage/volumes/web_data/data 目錄。

532.png

經過 docker inspect my_web.1.2j7dgzuyk9hodseej707t97su 能夠確認 /var/lib/libstorage/volumes/web_data/data 已經映射到容器目錄 /usr/local/apache2/htdocs

533.png

當前的實驗環境如圖所示:

534.png

下一節咱們驗證在故障狀況 Volume 的持久性。

書籍:

1.《天天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html

2.《天天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html

相關文章
相關標籤/搜索