1. 程式人生 > >如何實現跨 Docker 主機存儲?- 每天5分鐘玩轉 Docker 容器技術(73)

如何實現跨 Docker 主機存儲?- 每天5分鐘玩轉 Docker 容器技術(73)

docker 教程 容器

從業務數據的角度看,容器可以分為兩類:無狀態(stateless)容器和有狀態(stateful)容器。

無狀態是指容器在運行過程中不需要保存數據,每次訪問的結果不依賴上一次訪問,比如提供靜態頁面的 web 服務器。

有狀態是指容器需要保存數據,而且數據會發生變化,訪問的結果依賴之前請求的處理結果,最典型的就是數據庫服務器。

簡單來講,狀態(state)就是數據,如果容器需要處理並存儲數據,它就是有狀態的,反之則無狀態。

對於有狀態的容器,如何保存數據呢?

前面在 Docker 存儲章節我們學習到 data volume 可以存儲容器的狀態,不過當時討論的 volume 其本質是 Docker 主機 本地

的目錄。

本地目錄就存在一個隱患:如果 Docker Host 宕機了,如何恢復容器?

一個辦法就是定期備份數據,但這種方案還是會丟失從上次備份到宕機這段時間的數據。更好的方案是由專門的 storage provider 提供 volume,Docker 從 provider 那裏獲取 volume 並掛載到容器。這樣即使 Host 掛了,也可以立刻在其他可用 Host 上啟動相同鏡像的容器,掛載之前使用的 volume,這樣就不會有數據丟失。

本章將詳細討論如何實現跨 Docker 主機管理 data volume。

從一個例子開始

假設有兩個 Dokcer 主機,Host1 運行了一個 MySQL 容器,為了保護數據,data volume 由 storage provider 提供,如下圖所示。

技術分享

當 Host1 發生故障,我們會在 Host2 上啟動相同的 MySQL 鏡像,並掛載 data volume。

技術分享

Docker 是如何實現這個跨主機管理 data volume 方案的呢?

答案是 volume driver。

任何一個 data volume 都是由 driver 管理的,創建 volume 時如果不特別指定,將使用 local 類型的 driver,即從 Docker Host 的本地目錄中分配存儲空間。如果要支持跨主機的 volume,則需要使用第三方 driver。

目前已經有很多可用的 driver,比如使用 Azure File Storage 的 driver,使用 GlusterFS 的 driver,完整的列表可參考 https://docs.docker.com/engine/extend/legacy_plugins/#volume-plugins

我們這裏將選擇 Rex-Ray driver,其原因是:

  1. Rex-Ray 是開源的,而且社區活躍。

  2. 支持多種 backend,VirtualBox 的 Virtual Media、Amazon EBS、Ceph RBD、OpenStack Cinder 等。

  3. 支持多種操作系統,Ubuntu、CentOS、RHEL 和 CoreOS。

  4. 支持多種容器編排引擎,Docker Swarm、Kubernetes 和 Mesos。

  5. Rex-Ray 安裝使用方法非常簡單。

下一節我們開始實踐 Rex-Ray。

技術分享

如何實現跨 Docker 主機存儲?- 每天5分鐘玩轉 Docker 容器技術(73)