天天看點

容器鏡像的備份及恢複方案

作者:譽天教育ICT認證教育訓練

容器鏡像是容器的基石,也是容器運作的必備條件。容器鏡像若沒有備份和恢複方案,對企業的線上業務是極大的風險,可能會直接帶來業務的可用率和經濟損失。本章從容器鏡像的本質切入,針對單個鏡像、多個鏡像、不同的業務場景分别介紹容器鏡像的備份方案。

1、容器鏡像備份和恢複的意義

容器技術日趨廣泛應用,而容器鏡像的備份恢複則是保障容器業務的最初始一步,也是容器應用之上的業務穩定安全運作的第一步。容器鏡像本質上是檔案的集合,對于這些檔案的集合的備份和恢複也就是對應用的可靠、高效的保障。針對具體的使用場景,具有不同的意義。

  • 研發流程一緻性
  • 容器鏡像建構完成之後,需要進行一系列的測試、驗證、灰階、藍綠等等流程才能被正式部署上線。容器鏡像在代碼送出後第一步完成,為了確定後續流程使用的鏡像一緻,就需要對容器鏡像進行存儲備份。這樣所有流程就可以通過下載下傳鏡像,保證使用時同一份鏡像,也保證了線上和線下的業務一緻性。
  • 業務一緻性和可用性
  • 對于線上業務而言,為了保證業務的可用性,往往是多機房多環境同僚部署。容器鏡像的備份存儲就能保證每個生産環境業務的完全一緻,提高業務的穩定性。應用被部署之後,随着業務的發展需要,可能會有業務高峰期需要擴容,這時候容器鏡像就顯得尤為重要,可以確定擴容後業務的一緻性。當然線上業務也可能進行復原或者更新,這時候隻要有鏡像的存在,就可以實作滾動的快速的復原和更新,保障業務的可用性。
  • 安全審計
  • 在開發流程中有相應的代碼安全掃描和審計,對應的容器應用也是一樣。毫無疑問,為了保障生産的鏡像,往往不會直接複用生産鏡像的存儲進行安全和審計,會在生産鏡像備份一份同步進行安全和審計。

2、Dockerfile的存儲

容器鏡像一般是通過Dockerfile進行建構而得。首先來看兩個個标準的容器鏡像建構Dockerfile。一個是nginx鏡像的Dockerfile[6],另一個是常見的java應用。

容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案

如下所示,是一個java應用建構容器鏡像的Dockerfile。

容器鏡像的備份及恢複方案

第一個Nginx的例子中我們可以看到,其Dockerfile非常複雜,而第二個java應用的Dockerfile很簡單,基于tomcat将代碼war包拷貝至鏡像中即可。

容器鏡像Dockerfile一般可以分為兩種,标準化應用的容器鏡像Dockerfile,非标準化應用的容器Dockerfile。标準化應用容器的Dockerfile,變更很少,就像第二個Dockerfile示例一樣,隻需要将不同的war包放進即可。這類的Dockerfile備份一個即可。這類的容器鏡像恢複也有直接的企業流程,故而可以快速的恢複。Dockerfile本質上是一段建構鏡像的腳本檔案,存儲體積很小,需要進行版本管理。Dockerfile的備份和存儲,直接使用企業現有的代碼版本管理系統直接備份和儲存即可。

對于非标準化的鏡像Dockerfile則針對不同的需求定制不同的Dockerfile,這類變更頻次較低,建構的依賴檔案或者環境往往不進行備份,此類如果需要備份和存儲,需要将DockerFile中涉及的内容一起備份。

本小節介紹了基于Dockerfile的容器鏡像的備份和恢複,标準Dockerfile,企業代碼版本管理方式備份,建構環境恢複快速,容器鏡像恢複。非标準Dockerfile,Dockerfile和依賴内容一起備份,也可恢複。需要注意的是根據Dockerfile備份進而實作鏡像的備份,一般主要用于CI/CD的場景。因為Dockerfile備份的同時,需要對其所依賴的檔案以及建構環境都要進行備份,或者能實作快速建立,一旦建構環境或者依賴的war包等無法快速建立或者恢複,是無法現在鏡像的恢複。

3、單個容器的備份和恢複

容器鏡像是分層存儲,從這個角度,鏡像是相關檔案的集合。鏡像是否可以按照檔案備份那樣進行備份呢?

答案是肯定的。

容器鏡像的備份及恢複方案

在一般安裝了docker的機器上,可以使用docker save将容器鏡像儲存至壓縮檔案。如需要鏡像時候再将容器鏡像導入至本地。

如果是一個已經運作了容器,在原有的鏡像中修改了一些檔案,是否可以把相應的容器鏡像進行備份?

答案也是肯定的。

容器鏡像的備份及恢複方案
容器鏡像的備份及恢複方案

通過docker commit 将運作的容器先制作成相應的鏡像,再通過上述的docker save 和docker load 将鏡像導出和導入。

将鏡像導出成檔案,再進行備份,可以通過各種的檔案備份方案或者存儲方案進行備份。這種方式在正式的場景中用的比較少,一是操作比較複雜,效率不高,二是備份存儲媒體也有要求,三是正式場景中鏡像數量較多,也有成熟的容器鏡像存儲的方案。一般用在對于某些特性的場景鏡像調試時候會采用。

本小節示範和介紹了單個容器、單個容器鏡像的備份方法,操作簡便,效率有待商榷。可以備份使用頻次不高的鏡像,對于需要快速恢複和部署的場景需要商榷。

4、多容器鏡像的備份和恢複

容器鏡像來源于DockerFile,那麼隻要将Dockerfile和容器鏡像制作的環境備份和存儲,就能恢複容器鏡像。這種方案的前提是能通過DockerFile快速的建構容器鏡像。鏡像的制作目的是進行使用,企業内部使用,或者企業外部使用。是否有一個專門存儲鏡像的倉庫,鏡可以支援容器鏡像的高效下載下傳,友好管理呢?

有。

容器鏡像管理倉庫伺服器稱為Image Register,其中相應的鏡像倉庫稱為Image Repository。一個Image Register可以包含多個Repository。一個Repository會包含同一個軟體不同版本的鏡像,而标簽(Tag)就常用于對應該軟體的各個版本。可以通過 <倉庫名>:<标簽> 的格式來指定具體是這個軟體哪個版本的鏡像。

如果不設定标簽,将以 latest 作為預設标簽。如前面的nginx:alpine,其中nginx是軟體名,alpine是标簽。

Hello-world沒有指定Tag,在鏡像檢視是看到Tag是latest。

容器鏡像的備份及恢複方案

容器鏡像倉庫有公有倉庫,也稱第三方倉庫,和企業内部自行搭建的稱為,私有倉庫。

  • 公有倉庫(第三方倉庫)
  • 公有的Image Register一般提供容器鏡像免費上傳和下在服務,也可提供付費鏡像管理等服務。
  • 私有倉庫
  • 私有倉庫在企業内部使用,不對外釋出,在區域網路内,通路效率高。

使用公有Image Register,容器鏡像的備份一般相應的企業或者組織會進行維護。如需要企業内快速和高效使用,可以本地搭建一個私有Image Register進行本地Mirror。

使用私有Image Register,需要了解其相應的架構,将其重要的資料檔案進行備份。比如Harbor将資料使用獨立的volume挂載,相應的磁盤在機器上做快照或者選用RAID系列,也可搭建多個Image Register進行同步備份,也可将資料使用共享存儲進行挂載。目前的共享存儲多種多樣,例如SAN,NAS,分布式存儲等,可以結合企業已有的共享存儲是指快照或者異地備份等政策。

Image Register能進行友好、高效、統一管理容器鏡像。無論是采用公有Image Register還是私有Image Register,針對各個相應的軟體服務将重要的資料備份,即能實作容器鏡像的備份和恢複。

5、容器鏡像的備份和恢複場景

前面介紹了容器鏡像存備份的場景以及相應的意義。針對不同的容器備份場景采用不同的容器鏡像備份方式方法。如下所示是幾種場景場景的解決方案。

  • CI/CD流程中标準建構的容器鏡像
  • 對于CI/CD流程中标準建構的容器鏡像,其Dockerfile檔案是标準,比如前面的java應用的Dockerfile,每個不同版本隻需要替換其中的war包。此種場景中,隻需要将Dockerfile進行版本管理,需要時将Dockerfile依賴的代碼和環境是快速搭建和恢複,建構鏡像,然後将鏡像傳送至Image Register,實作容器鏡像存儲在Image Register的生命周期較短儲存,減輕Image Register的中容器鏡像的存儲壓力。
  • 應用系統
  • 系統類應用,比如Ingress、CoreDNS、Pormetheus等等,部署頻次不高,同時鏡像的個數也不多,這類應用應多重備份,多個Image Register之間備份,甚至可以參考上一章節的導出至檔案進行備份,安全政策允許的前提下可以釋出至公網的Image Register。
  • 安全審計
  • 安全審計通常時間跨度較長,如果一直存儲在Image Register上,毫無疑問有存儲成本和Image Register鏡像使用效率影響。此種場景可以分級進行備份。距離目前時間較長的鏡像使用低成本的存儲進行備份,距離目前時間短的鏡像使用Dockerfile、Image Register進行備份。

總結

本文介紹了容器鏡像的本質,容器鏡像的從代碼,到Dockerfile,到鏡像再到存儲,再到業務運作的“一生”。對于不同的需求有着不同的備份和存儲的要求和意義。随着業務的增長和時間的推移,鏡像的數量和存儲的空間肯定都會面臨挑戰,是以一開始就需要明确存儲和備份的業務需求,選擇好對應的方案,再進行細化。就像使用Image Register也要細化容器鏡像的生命周期,Image Register的存儲方式,Docker Register的高可用,監控、告警等等。希望本文從本質上介紹後,能給大家以更多的思考。

作者:鄭公子

來源:twt社群

繼續閱讀