【译】A Beginner-Friendly Introduction to Containers, VMs and Docker
如果你是程序員或技術人員,你很可能至少聽說過Docker:一個有用的工具,用于在“容器”中打包,運送和運行應用程序。它很難不被所有的關注所吸引這些天 - 來自開發人員和系統管理員。?即使像谷歌,VMware和亞馬遜這樣的大型犬也正在構建支持它的服務。
無論你是否對Docker都有一個直接的用例,我仍然認為了解一些關于“容器”是什么以及它與虛擬機(VM)相比的基本概念是很重要的。?雖然互聯網上充滿了Docker的優秀使用指南,但我找不到許多適合初學者的概念指南,特別是關于容器的構成。?所以,希望這篇文章能解決這個問題:)
讓我們首先了解VM和容器甚至是什么。
什么是“容器”和“虛擬機”?
容器和虛擬機的目標相似:將應用程序及其依賴項隔離到可以在任何地方運行的獨立單元。
此外,容器和VM消除了對物理硬件的需求,從而在能耗和成本效率方面允許更有效地使用計算資源。
容器和VM之間的主要區別在于它們的架構方法。?讓我們仔細看看。
虛擬機
VM本質上是對真實計算機的仿真,該計算機執行類似于真實計算機的程序。?VM使用“管理程序”在物理機器上運行。?反過來,管理程序可以在主機上運行,??也可以在“裸機”上運行?。
讓我們解開行話:
虛擬機管理程序是虛擬機運行的軟件,固件或硬件。?管理程序本身在物理計算機上運行,??稱為“主機”?。?主機為VM提供資源,包括RAM和CPU。?這些資源在VM之間劃分,可以根據需要進行分發。?因此,如果一個VM運行的資源更多的應用程序,您可能會分配更多的資源,而不是在同一主機上運行的其他VM。
在主機上運行的VM(同樣,使用管理程序)通常也稱為“客戶機”。此客戶機包含應用程序以及運行該應用程序所需的任何內容(例如系統二進制文件和庫)。?它還帶有自己的整個虛擬化硬件堆棧,包括虛擬化網絡適配器,存儲和CPU - 這意味著它還擁有自己的完整客戶操作系統。?從內部來看,客戶機具有自己的專用資源。?從外部來看,我們知道它是一個VM - 共享主機提供的資源。
如上所述,來賓計算機可以在托管虛擬機管理程序或裸機虛擬機管理程序上運行?。?它們之間存在一些重要的差異。
首先,托管虛擬化管理程序在主機的操作系統上運行。?例如,運行OSX的計算機可以在該OS之上安裝VM(例如VirtualBox或VMware Workstation 8)。VM無法直接訪問硬件,因此必須通過主機操作系統(在我們的例子中是Mac的OSX)。
托管虛擬機管理程序的好處是底層硬件不那么重要。?主機的操作系統負責硬件驅動程序而不是管理程序本身,因此被認為具有更多的“硬件兼容性”。另一方面,硬件和管理程序之間的這個附加層會產生更多的資源開銷,從而降低VM的性能。
裸機虛擬機管理程序環境通過在主機的硬件上安裝和運行來解決性能問題。因為它直接與底層硬件接口,所以它不需要運行主機操作系統。?在這種情況下,作為操作系統安裝在主機服務器上的第一件事就是管理程序。?與托管虛擬機管理程序不同,裸機虛擬機管理程序具有自己的設備驅動程序,可直接與每個組件交互,以執行任何I / O,處理或特定于操作系統的任務。?這樣可以獲得更好的性能,可伸縮性和穩定性。?這里的權衡是硬件兼容性有限,因為管理程序只能內置如此多的設備驅動程序。
在討論了虛擬機管理程序之后,您可能想知道為什么我們在VM和主機之間需要這個額外的“虛擬機管理程序”層。
好吧,由于VM擁有自己的虛擬操作系統,因此虛擬機管理程序在為VM提供管理和執行此客戶機操作系統的平臺方面發揮著重要作用。?它允許主機在作為客戶端運行的虛擬機之間共享其資源。
虛擬機圖
如圖所示,VM為每個新VM打包虛擬硬件,內核(即操作系統)和用戶空間。
容器
與提供硬件虛擬化的VM不同,容器通過抽象“用戶空間”來提供操作系統級虛擬化。?當我們解開術語容器時,你會明白我的意思。
出于所有意圖和目的,容器看起來像VM。?例如,它們具有用于處理的私有空間,可以以root身份執行命令,具有專用網絡接口和IP地址,允許自定義路由和iptable規則,可以掛載文件系統等。
容器和VM之間的一個重要區別是容器*與其他容器共享*主機系統的內核。
容器圖
此圖顯示容器僅打包用戶空間,而不是像VM那樣打包內核或虛擬硬件。?每個容器都有自己獨立的用戶空間,以允許多個容器在單個主機上運行。?我們可以看到所有操作系統級體系結構都在容器之間共享。?從頭開始創建的唯一部分是bin和libs。?這就是容器如此輕巧的原因。
Docker從哪里來?
Docker是一個基于Linux容器的開源項目。?它使用Linux內核功能(如命名空間和控制組)在操作系統之上創建容器。
容器遠非新的;?谷歌多年來一直在使用自己的容器技術。?其他Linux容器技術包括Solaris Zones,BSD jails和LXC,它們已經存在多年。
那么為什么Docker會突然獲得成功?
1.?易于使用:?Docker使任何人 - 開發人員,系統管理員,架構師和其他人 - 更容易利用容器來快速構建和測試便攜式應用程序。?它允許任何人在他們的筆記本電腦上打包應用程序,而這些應用程序又可以在任何公共云,私有云甚至裸機上運行。?口頭禪是:“建造一次,隨處運行”。
2.?速度:?Docker容器非常輕巧,快速。?由于容器只是在內核上運行的沙盒環境,因此它們占用的資源更少。?與可能需要更長時間的VM相比,您可以在幾秒鐘內創建并運行Docker容器,因為它們每次都必須啟動完整的虛擬操作系統。
3.?Docker Hub:?Docker用戶也可以從日益豐富的Docker Hub生態系統中受益,您可以將其視為“Docker圖像的應用商店”.Docker Hub擁有數萬個社區創建的公共圖像,這些圖像隨時可用用來。?搜索滿足您需求的圖像非常容易,準備下拉并使用幾乎沒有修改。
4.?模塊化和可擴展性:?Docker可以輕松地將應用程序的功能分解為單個容器。?例如,您的Postgres數據庫可能在一個容器中運行,而您的Redis服務器在另一個容器中運行,而Node.js應用程序在另一個容器中。?使用Docker,將這些容器鏈接在一起以創建應用程序變得更加容易,從而使您可以在將來輕松擴展或更新組件。
最后但并非最不重要的是,誰不喜歡Docker鯨??;)
資料來源:?https?:?//www.docker.com/docker-birthday
基本的Docker概念
現在我們已經掌握了大局,讓我們一塊一塊地瀏覽Docker的基本部分:
Docker引擎
Docker引擎是Docker運行的層。?它是一個輕量級的運行時和工具,可以管理容器,圖像,構建等。?它在Linux系統上本機運行,由以下部分組成:
1.在主機中運行的Docker守護程序。?
 2. Docker客戶端,然后與Docker守護程序通信以執行命令。?
 3.用于遠程與Docker守護程序交互的REST API。
Docker客戶端
Docker客戶端就像Docker的最終用戶一樣與之通信。?可以把它想象成Docker的UI。?例如,當你做...
?
您正在與Docker客戶端進行通信,然后Docker客戶端將您的指令傳遞給Docker守護程序。
Docker守護進程
Docker守護程序實際上是執行發送到Docker Client的命令 - 比如構建,運行和分發容器。?Docker守護程序在主機上運行,??但作為用戶,您永遠不會直接與守護程序通信。?Docker Client也可以在主機上運行,??但不是必需的。?它可以在不同的計算機上運行,??并與在主機上運行的Docker守護程序進行通信。
Dockerfile
您可以在Dockerfile中編寫構建Docker鏡像的說明。?這些說明可以是:
- 運行apt-get y install some-package?:安裝軟件包
- EXPOSE 8000:暴露端口
- ENV ANT_HOME / usr / local / apache-ant傳遞環境變量
等等。?一旦設置了Dockerfile,就可以使用docker?build命令從中構建映像。這是Dockerfile的一個例子:
?
示例Dockerfile
Docker Image
圖像是只讀模板,您可以使用Dockerfile中編寫的一組指令構建這些模板。圖像定義了您希望打包的應用程序及其依賴項看起來像*和*在啟動時運行的進程。
Docker鏡像是使用Dockerfile構建的。?Dockerfile中的每條指令都為圖像添加了一個新的“圖層”,圖層表示圖像文件系統的一部分,可以添加或替換它下面的圖層。?圖層是Docker輕巧而強大的結構的關鍵。?Docker使用Union File System來實現這個目的:
聯合文件系統
Docker使用Union File Systems來構建映像。?您可以將Union文件系統視為可堆疊文件系統,這意味著可以透明地覆蓋單獨文件系統(稱為分支)的文件和目錄以形成單個文件系統。
在重疊分支內具有相同路徑的目錄的內容被視為單個合并目錄,這避免了為每個層創建單獨副本的需要。?相反,它們都可以被賦予指向同一資源的指針;?當某些圖層需要修改時,它會創建一個副本并修改一個本地副本,保持原始版本不變。?這就是文件系統如何*可寫*而不實際允許寫入。?(換句話說,就是“寫時復制”系統。)
分層系統有兩個主要優點:
1.無復制:每次使用圖像創建和運行新容器時,圖層有助于避免復制完整的文件集,從而使docker容器的實例化非常快速且便宜。?
 2.?圖層隔離:進行更改要快得多 - 當您更改圖像時,Docker只會將更新傳播到已更改的圖層。
卷
卷是容器的“數據”部分,在創建容器時初始化。?卷允許您持久化并共享容器的數據。?數據卷與默認的Union File System分開,并作為主機文件系統上的普通目錄和文件存在。?因此,即使您銷毀,更新或重建容器,數據卷也將保持不變。?如果要更新卷,可以直接對其進行更改。?(作為額外的獎勵,數據量可以在多個容器之間共享和重用,這非常簡潔。)
Docker容器
如上所述,Docker容器將應用程序的軟件包裝到一個隱藏的框中,其中包含應用程序運行所需的所有內容。?這包括操作系統,應用程序代碼,運行時,系統工具,系統庫等.Docker容器是基于Docker鏡像構建的。?由于圖像是只讀的,因此Docker在圖像的只讀文件系統上添加了一個讀寫文件系統來創建容器。
資料來源:Docker
此外,然后創建容器,Docker創建一個網絡接口,以便容器可以與本地主機通信,將可用的IP地址附加到容器,并在定義映像時執行您指定的運行應用程序的進程。
成功創建容器后,即可在任何環境中運行它,而無需進行更改。
雙擊“容器”
唷!?這是很多活動部分。?讓我感到好奇的一件事是如何實際實現容器,特別是因為容器周圍沒有任何抽象的基礎設施邊界。?經過大量的閱讀,這一切都是有道理的,所以這是我嘗試向你解釋它!?:)
術語“容器”實際上只是一個抽象概念,用于描述一些不同的特征如何協同工作以可視化“容器”。?讓我們快速瀏覽它們:
1)命名空間
命名空間為容器提供了自己的底層Linux系統視圖,限制了容器可以查看和訪問的內容。?當您運行容器時,Docker會創建特定容器將使用的命名空間。
Docker使用的內核中有幾種不同類型的命名空間,例如:
一個。?NET:為容器提供自己的系統網絡堆棧視圖(例如,自己的網絡設備,IP地址,IP路由表,/ proc / net目錄,端口號等)。?
 灣?PID:?PID代表進程ID。?如果您曾在命令行中運行ps aux來檢查系統上正在運行的進程,那么您將看到一個名為“PID”的列。?PID命名空間為容器提供了他們可以查看和交互的進程的范圍視圖,包括獨立的init(PID 1),它是“所有進程的祖先”。?
 C。?MNT:為容器提供系統上“掛載”的自己視圖。?因此,不同安裝命名空間中的進程具有文件系統層次結構的不同視圖。?
 d。?UTS:?UTS代表UNIX分時系統。?它允許進程識別系統標識符(即主機名,域名等)。?UTS允許容器擁有自己的主機名和NIS域名,該域名獨立于其他容器和主機系統。?
 即?IPC:?IPC代表InterProcess Communication。?IPC命名空間負責隔離每個容器內運行的進程之間的IPC資源。?
 F。?USER:此命名空間用于隔離每個容器中的用戶。?它的功能是允許容器與主機系統相比具有uid(用戶ID)和gid(組ID)范圍的不同視圖。?因此,進程的uid和gid可以在用戶命名空間的內部和外部不同,這也允許進程在容器外部擁有非特權用戶,而不會犧牲容器內的root權限。
Docker將這些命名空間一起使用,以隔離并開始創建容器。?下一個功能稱為控制組。
2)?對照組
控制組(也稱為cgroup)是一種Linux內核功能,用于隔離,確定優先級并說明一組進程的資源使用情況(CPU,內存,磁盤I / O,網絡等)。?從這個意義上講,cgroup確保Docker容器只使用他們需要的資源 - 如果需要,還可以設置容器*可以使用的資源限制。?Cgroup還確保單個容器不會耗盡其中一個資源并導致整個系統崩潰。
最后,聯合文件系統是Docker使用的另一個功能:
3)?隔離聯盟文件系統:
上面在Docker Images部分中描述:)
這就是Docker容器的全部內容(當然,魔鬼在實現細節中 - 比如如何管理各個組件之間的交互)。
Docker的未來:Docker和VM將共存
雖然Docker肯定獲得了很多動力,但我認為它不會成為虛擬機的真正威脅。容器將繼續發揮作用,但有許多用例仍然更適合虛擬機。
例如,如果您需要在多個服務器上運行多個應用程序,則使用VM可能是有意義的。?另一方面,如果您需要運行單個應用程序的許多*副本*,Docker提供了一些引人注目的優勢。
此外,雖然容器允許您將應用程序分解為更多功能性的離散部件以創建關注點分離,但這也意味著需要管理的部件越來越多,這可能變得難以處理。
安全性也是Docker容器所關注的一個領域 - 由于容器共享相同的內核,容器之間的障礙更薄。?雖然完整的VM只能向主機管理程序發出超級調用,但Docker容器可以向主機內核發出系統調用,從而為攻擊創建更大的表面區域。?當安全性特別重要時,開發人員可能會選擇由抽象硬件隔離的虛擬機 - 這使得互相干擾變得更加困難。
當然,安全和管理等問題肯定會隨著容器在生產中的更多曝光和用戶的進一步審查而發展。?就目前而言,關于容器與虛擬機之間的爭論對于那些每天生活和呼吸它們的人來說真的是最好的!
結論
我希望您現在擁有了解Docker所需的知識,甚至可能有一天會在項目中使用它。
?
https://medium.freecodecamp.org/a-beginner-friendly-introduction-to-containers-vms-and-docker-79a9e3e119b
總結
以上是生活随笔為你收集整理的【译】A Beginner-Friendly Introduction to Containers, VMs and Docker的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【译】Writing a Simple
- 下一篇: 【译】A Kubernetes quic
