一、什麼是容器 1、容器是一種輕量級、可移植、自包含的軟體打包技術,使應用程式可以在幾乎任何地方以相同的方式運行。開發人員在自己的筆記本上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、或物理伺服器、或公有雲主機上運行。 2、容器與虛擬機的異同: 容器與虛擬機都是為應用提供封裝和隔離。 容 ...
一、什麼是容器
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容器技術》