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

從業務數據的角度看,容器能夠分爲兩類:無狀態(stateless)容器和有狀態(stateful)容器。web

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

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

簡單來說,狀態(state)就是數據,若是容器須要處理並存儲數據,它就是有狀態的,反之則無狀態。服務器

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

前面在 Docker 存儲章節咱們學習到 data volume 能夠存儲容器的狀態,不過當時討論的 volume 其本質是 Docker 主機 本地 的目錄。ide

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

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

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

從一個例子開始

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

當 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。

二維碼+指紋.png

相關文章
相關標籤/搜索