1. 程式人生 > >Dock學習(一):容器介紹

Dock學習(一):容器介紹

一、什麼是容器

  1、容器是一種輕量級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式執行。開發人員在自己的筆記本上建立並測試好的容器,無需任何修改就能夠在生產系統的虛擬機器、或物理伺服器、或公有云主機上執行。

  2、容器與虛擬機器的異同:

    容器與虛擬機器都是為應用提供封裝和隔離。

    容器由兩部分組成:

    1)應用程式本身;

    2)依賴部分,如應用程式需要的元件庫或其他軟體;

    容器在宿主作業系統的使用者空間中執行,與作業系統的其他程序隔離,這一點顯著區別於虛擬機器。

    傳統的虛擬化技術,比如VMWare、KVM,目標均是建立完整的虛擬機器。為了執行應用程式,除了部署應用自身及其依賴,還需要安裝整個作業系統。

    兩者區別如下圖所示:

    

    由圖中對比可知,由於所有的容器共享一個宿主作業系統,這使得容器在體積上要比虛擬機器小很多。另外,啟動容器不需要啟動整個作業系統,所以容器部署和啟動速度更快,開銷也更小,也更容易遷移。

 二、為什麼使用容器

  在談論為什麼使用容器之前,先看一下之前為什麼用不著容器。之前的系統,幾乎所有的系統均採用三層架構就可以很好的解決使用需求。而當今的系統,需要使用更多的服務,比如MQ、快取、資料庫來構建和組裝應用。而且應用程式很可能被部署到不同的環境,比如虛擬伺服器、私有云、公有云上。

  所以,對於當今系統一方面應用中包含了多種服務,這些服務有自己所依賴的元件庫或軟體包;另一方面存在多種部署環境,應用在執行時可能需要動態遷移到不同的環境中,如何保證各個服務能夠在各種環境中正常執行就是一個很難解決的問題。

  藉助於運輸行業集裝箱的啟發,Docker將集裝箱思想運用到軟體打包上,為程式碼提供了一個基於容器的標準化運輸系統。Docker可以將任何應用及其依賴打包成一個輕量級、可移植、自包含的容器,容器可以執行在任何作業系統上。

  由此可知,使用容器的原因就是:容器使軟體具備了超強的可移植能力。從Docker的標誌性圖片中,也很形象的表達Docker的思想,像集裝箱一樣可以方便的運送貨物。

   

三、容器的特性 

 

  對於開發人員而言,容器意味著環境隔離和可重複性,開發人員只需為應用建立一次執行環境,然後打包成容器便可以在其他機器上執行。另外,容器環境與所在的宿主系統環境是隔離的,就像虛擬機器一樣,但是比虛擬機器更快更簡單。真正實現了Build Once,Run Anywhere(一次執行,到處執行)

  對於運維人員而言,只需要配置好標準的執行環境,伺服器就可以執行任何容器。這使得運維人員的工作效率更高,同時也使工作也變得一致和可重複。由此可見,容器消除了開發、測試、生產環境的不一致性。

四、容器生態系統

  一談到容器,大家都會想到Docker,Docker幾乎是容器的代名詞。確實,是Docker將容器技術發揚光大,同時圍繞Docker還有一個生態系統。

  容器生態系統包括如下幾部分:

  1、容器核心技術,就是能夠讓Container(容器)在宿主系統上執行起來的技術,包括:

    1)容器規範

      除了Docker之外,還有其他容器,如HeroKu、NodeJitsu。為了保障容器之間可以相容,Docker、CoreOS、Google等公司成立了OCI組織(Open Container Initiative),制定開放的容器規範。

      目前有兩種規範:a)Runtime Spec;b)Image Format Spec;這兩種規範讓不同組織和廠商開發的容器能夠在不同的容器Runtime上執行,保證了容器的可移植性和互操作性。

    2)容器Runtime

      容器Runtime是容器真正可以執行的地方,Runtime需要和作業系統kernel緊密協作,為容器提供執行環境。

      目前主流的容器Runtime有:

      a)lxc:運行於Linux上的容器Runtime,可以執行Docker;

      b)runc:是Docker開發的容器Runtime,是現在Docker預設的Runtime;

      c)rkt:是CoreOS開發的容器Runtime,可以執行Docker;

    3)容器管理工具

      容器管理工具對內與Runtime互動,對外為使用者提供Interface,比如CLI,可以使使用者有工具來管理容器,相關工具有:

      a)lxd是lxc對應的管理工具;

      b)docker engine是對runc的管理工具,該工具包括Deamon和Cli兩個部分。對於通常說的Docker,一般指docker engine。

      c)rkt cli是rkt的管理工具;

    4)容器定義工具

      容器定義工具的作用是允許使用者定義容器的內容和屬性,這樣容器就能夠被儲存,共享和重建。相關工具有:

      a)docker image是docker容器的模板,容器runtime依據docker image建立容器;

      b)docker file是包含若干命令的文字檔案,用於創建出docker image;

      c)ACI(App Container Image)與docker image類似,它是由CoreOS開發的rkt容器的image格式;

    5)Registry

      容器是通過image(映象)建立的,需要有一個倉庫來統一存放image,這些倉庫就是Registry。

      a)Docker Registry,可以利用Docker Registry構建私有的Registry;

      b)Docker Hub:https://hub.docker.com/ 是Docker為公眾提供的託管Registry,上面有許多現成的Image;

      c)Quay.io:https://quay.io 提供與Docker Hub類似的服務;

    6)容器OS

      容器OS是專門執行容器的作業系統,與常規OS相比,容器OS通常體積更小,啟動更快。因為是為容器定製的OS,通常它們執行容器的效率會更高。

      a)CoreOS;

      b)atomic;

      c)ubuntu core;

  2、容器平臺技術,能夠讓容器作為叢集在分散式環境中執行。

    1)容器編排引擎,基於容器的應用一般會採用微服務架構,在這種架構下,不同應用被劃分成不同的服務容器叢集,叢集中的容器會根據業務需要被動態的建立、遷移和銷燬。

      所謂容器編排,通常包括容器管理、高度、叢集定義和服務發現等。通過容器編排引擎,容器被有機的組合成微服務應用,實現業務需求。編排引擎分為:

      a)swarm:是Docker開發的容器編排引擎;

      b)k8s:google開發的開源容器編排引擎,支援Docker和CoreOS;

      c)mesos+marathon:mesos是一個通用的叢集資源排程平臺;兩者一起提供容器編排引擎功能;

    2)容器管理平臺,是在容器編排引擎之上的一個更為通用的平臺,通常容器管理平臺支援多種編排引擎,抽象了編排引擎的底層實現細節,為使用者提供更方便的功能。

      a)Rancher

      b)ContainerShip;

    3)基於容器的Paas,它為微服務應用開發人員提供了開發、部署和管理應用的平臺,使用者不必關心底層基礎設施而專注於應用的開發。

      a)Deis;

      b)Flynn;

      c)Dokku;     

  3、容器支援技術 

    1)容器網路

      容器的出現使網路拓撲變得更加動態和複雜,使用者需要專門的解決方案來管理容器與容器、容器與其他實體之間的連通性和隔離性。

      a)Docker Network;

      b)Flannel;

      c)Weave;

      d)Calico;

    2)服務發現

      在微服務應用中,叢集會根據負載的強弱對容器進行動態增減,或者根據宿主資源的不同進行動態遷移,容器的IP和埠也會發生變化。服務發現就是提供一種讓客戶端能夠知道如何訪問容器提供的服務的機制。服務發現會儲存容器叢集中所有微服務最新的資訊,如IP和埠,以向外提供API。

      a)etcd;

      b)consul;

      c)zookeeper;

    3)監控

      a)docker ps/top/stats;

      b)docker stats API;

      c)sysdig;

      d)cAdvisor/Heapster;

      e)Weave Scope;

    4)資料管理

      容器經常在不同的宿主之間遷移,需要保證持久化資料也能夠動態遷移。

      a)Flocker;

    5)日誌管理

      日誌為問題排查和事件管理提供了重要依據。

      a)docker logs:Docker原生的日誌工具;

      b)logspout:對日誌提供了路由功能,它可以收集不同容器的日誌並轉發給其他工具後進行處理;

    6)安全性

      a)OpenSCAP:它能夠對容器映象進行掃描,發現潛在的漏洞;

 

  大家可關注我的公眾號  

     

   知識學習來源:CloudMan:《每天5分鐘玩轉Docker容器技術》