歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Docker —— 用於統一開發和部署的輕量級 Linux 容器

Docker —— 用於統一開發和部署的輕量級 Linux 容器

日期:2017/2/28 14:30:31   编辑:Linux教程

使用Docker容器——輕量靈活的VM同類,來接管“依賴地獄”。學習Docker是如何基於LXC技術,通過把應用包裝在容器裡來使應用具有移植性和獨立性。

想象一下可以輕松地把應用和它的依賴打包,然後在其他的開發、測試和生產環境上平滑的運行。這就是開源Docker項目的目標。盡管它現在還沒正式到生產階段,最新的發布(本篇文章編寫時是0.7.x)使得Docker實現這一偉大目標又近了一步。

Docker容器試圖解決“依賴地獄”問題。現代的應用通常從已存在的組件組合而來,並且依賴其他服務和應用。比如,你的Python應用可能使用Postgre所為一個數據存儲,用Redis緩存以及使用Apache作web服務器。每個這些組件都附帶自身的一些依賴,這些依賴可能與其他組件產生沖突。通過打包每個組件及其依賴,Docker容器解決以下問題:

  • 沖突依賴:需要在PHP4.3上運行一個web站點而另一個運行在PHP5.5上?如果你在一個獨立的Docker容器中運行每個版本的PHP,那就沒問題。

  • 缺少依賴:在一個新環境上安裝應用對Docker容器來說只是瞬間的事情,因為所有的依賴都和這個應用一起打包到一個容器中。

  • 平台依賴:從一個發行版移動到另一個不再是一個麻煩。如果兩個系統都運行了Docker容器,那麼相同的容器執行起來將沒有任何問題。

Docker容器:一點背景

2013年初,Docker在dotCloud—一個平台即服務的、以雲計算為中心的公司,以一個開源項目的形式誕生。Docker是該公司已經開發的用來在數千台服務器上運行雲業務的一個自然擴展技術。它是用Go語言編寫的,Go語言是由谷歌開發的一種基於C語言且語法松散的靜態類型編程語言。快速發展了6到9個月,這家公司聘請了一個新的CEO,加入了Linux基金會,將公司名改為Docker,並且宣布將工作重心轉移到Docker容器及其生態系統的開發。作為Docker容器的受歡迎程度進一步說明,在寫這篇文章的時候,它已經在GitHub上被 Star 8985次並 Fork1304次。圖1表明了Docker容器在谷歌搜索持續上升的受歡迎度。隨著Docker公司發布了第一個版本容器的產品部署以及廣泛的社區知道了Docker容器的有用性,預計過去12個月的波形圖將會在未來12個月內相形見绌。

圖1. 過去12個月Docker軟件在谷歌搜索上的趨勢圖

開源項目Docker,Red Hat新的虛擬化選擇 http://www.linuxidc.com/Linux/2013-10/91051.htm

dockerlite: 輕量級 Linux 虛擬化 http://www.linuxidc.com/Linux/2013-07/87093.htm

Docker的搭建Gitlab CI 全過程詳解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 和一個正常的虛擬機有何區別? http://www.linuxidc.com/Linux/2013-12/93740.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

Docker 將改變所有事情 http://www.linuxidc.com/Linux/2013-12/93998.htm

Docker 1.0 正式版發布下載 http://www.linuxidc.com/Linux/2014-06/102941.htm

在引擎罩下

Docker運用了一些強大的內核級技術並讓我們觸手可及。容器虛擬化的概念早在幾年前已經出現,但通過提供一個簡單的工具集和統一的API接口管理一些內核級技術,如LXCs(Linux容器)、cgroups和一個寫復制文件系統,Docker已經創建了一個比其各部件更好的工具。它就是一個潛在的用於開發運營商、系統管理員和開發者的規則轉換器。

Docker提供工具使得利用容器創建和操作盡可能簡單,容器沙箱相互處理。你可以暫時把一個容器當成一個輕量級的虛擬機。

Linux容器和LXC,一個用於Linux容器的用戶空間控制程序包,是組成Docker的核心,LXC使用內核級命名空間將主機和容器相互隔離。用戶命名空間將主機和容器的用戶數據庫分離,這樣保證了容器的root用戶沒有主機的root權限。程序命名空間僅負責顯示和管理程序在容器中,而非在主機運行。而且網絡命名空間提供自己的網絡設備和虛擬IP地址給容器。

LXC提供的另一個組件是控制組(cgroups)。命名空間負責主機與容器之間的隔離,而控制組實現資源核算和限制。當允許Docker限制被一個容器消耗的資源:如內存、磁盤空間和輸入輸出時,控制組也會輸出大量與之相關的指標。這些指標使Docker能夠監控容器內各個進程的資源消耗並確保每個進程只獲取可用的公平共享資源。

除了以上組件,Docker一直在用AuFS(高級多層次統一文件系統)作為容器的文件系統。AuFS是一個能透明覆蓋一或多個現有文件系統的層狀文件系統。當一個進程需要修改一個文件時,AuFS創建該文件的一個副本。AuFS可以把多層合並成文件系統的單層表示。這個過程稱為寫復制。

真正酷斃的是,AuFS允許Docker把某些鏡像作為容器的基礎。例如,你可能有一個可以作為很多不同容器的基礎的CentOS系統鏡像。多虧AuFS,只要一個CentOS鏡像的副本就夠了,這樣既節省了存儲和內存,也保證更快速的容器部署。

使用AuFS的另一個好處是Docker的版本容器鏡像能力。每個新版本都是一個與之前版本的簡單差異改動,有效地保持鏡像文件最小化。但,這也意味著你總是要有一個記錄該容器從一個版本到另一個版本改動的審計跟蹤。

傳統上,Docker依賴AuFS提供了寫復制存儲機制。然而,最近添加的一個存儲啟動API可能降低這種依賴。最初,可用的存儲驅動有三種:AuFS、VFS和設備映射器-與紅帽合作的產物。

自版本0.7起,Docker就與所有Linux發行版協作。然而,它並沒有兼顧大部分非Linux系統,如Windows和OS X。在那些操作系統上使用Docker的推薦方式是,用Vagrant在VirtualBox上提供一個虛擬機。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-06/103609p2.htm

Copyright © Linux教程網 All Rights Reserved