天天看點

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

service 的容器副本會 scale up/down,會 failover,會在不同的主機上建立和銷毀,這就引出一個問題,如果 service 有要管理的資料,那麼這些資料應該如何存放呢?

選項一:打包在容器裡。

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

選項二:資料放在 Docker 主機的本地目錄中,通過 volume 映射到容器裡。

位于同一個主機的副本倒是能夠共享這個 volume,但不同主機中的副本如何同步呢?

選項三:利用 Docker 的 volume driver,由外部 storage provider 管理和提供 volume,所有 Docker 主機 volume 将挂載到各個副本。

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

我們将以 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

執行如下指令:

<code>--mount</code> 指定資料卷的 <code>volume-driver</code> 為 <code>rexray</code>。

<code>source</code> 指定資料卷的名字為 <code>web_data</code>,如果不存在,則會建立。

<code>target</code> 指定将資料卷 mount 到每個副本容器的 <code>/usr/local/apache2/htdocs</code>,即存放靜态頁面的目錄。

通路 service:

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

service 已經可以通路了:

目前 Rex-Ray volume <code>web_data</code> 被挂載到 node <code>swarm-worker1</code>。

mount