標籤:blog http io ar os 使用 java for sp
Docker是由PaaS供應商dotCloud在2013年年初建立的一款開源應用引擎,Docker可以自動將任何應用打包成輕量、可移植、自包涵的容器引擎。開發人員構建的應用可以一次構建全平台運行,包括本地開發機器,生產環境,虛擬機器和雲等。
Docker基於Go語言開發,代碼託管在 Github上,並遵循Apache 2.0開源協議。近期,這個項目得到了越來越多的使用者追捧,Github上的Star數已經9000多,Google的Compute Engine也支援 Docker,而在國內,知名的 百度也把Docker作為其Paas的基礎。
來自Docker官方部落格
Docker容器可以封裝任何承載,幾乎可以在任何伺服器之間進行一致性運行。
Docker的常用案例包括:
- 自動打包和部署應用
- 建立輕量、私人的PaaS環境
- 自動化測試和持續整合/部署
- 部署並擴充Web應用、資料庫和後端伺服器
背景
十五年前,幾乎所有的應用都是採用定義良好的堆棧編寫,並且部署到單一的專有伺服器上。今天,開發人員可以使用現成的最佳服務組合構建和裝配應用程式,並且為這些應用程式進行跨不同硬體環境的多重部署做好了準備,包括公用的、私人的和虛擬化的伺服器。
圖1 IT演變
這種設定可能會用在:
- 不同服務和“依賴抵禦”之間的相互不良反應
- 在快速遷移和跨不同硬體之間面臨挑戰,不可能管理一個跨多個服務並且被部署在不同硬體類型上的矩陣。
圖2 多個棧和多種硬體環境所面臨的挑戰
我們可以看到,這裡有大量的組合和排列應用/服務以及隨時需要考慮每一個應用程式被寫入或改寫的硬體環境。這將給編寫應用程式的開發人員和試圖建立一個穩定、安全、高效能作業環境的人們帶來一個困難的局面。
圖3 使用動態棧和動態硬體環境建立一個N*N矩陣
那麼,該如何解決這種局面呢?讓我們舉個運輸界的例子,在1960年之前,大多數散貨通過船進行託運,託運人和承運人很擔心不同類型的貨物之間會發生些不良反應(例如,一批鐵壓在一袋香蕉上)。同樣,各種不同運輸方式之間進行轉換也是非常痛苦的,其中一大半的時間都是花在港口對貨物進行卸載,然後再裝載,並且還要等待同一批貨物一起被裝到火車、卡車等交通工具上。這樣,在多種不同物品和多個不同的運輸機制之間就存在一個N*N的矩陣。
圖4 1960年之前的海運
幸運地是,標準集裝箱的出現解決了以上所面臨的難題。任何貨物,從開心果到保時捷,都可以通過標準集裝箱進行封裝。託運人員或承運人可以把集裝箱進行密封或者禁止再次開啟,直到運輸到目的地。在運輸過程中,集裝箱可以被卸載、裝載、堆積、運輸並且還可以有效地長距離運輸。集裝箱顛覆了全球運輸方式——一個標準,讓貨物在火車、汽車、輪船之間暢通無阻。今天,有1800萬隻集裝箱進行著90%的世界貿易。
圖5 一個標準容器(集裝箱)的出現解決了運輸方面的難題
在某種程度上,Docker可以看作是用代碼編寫出來的國際集裝箱。
圖6 軟體“運輸”解決方案也是一個標準的容器系統
Docker可以把任何應用及相關依賴項打包成一個輕量、可移植、自包涵式的容器,該容器擁有標準的操作,從而能夠實現自動化。與此同時,所有的應用都可以運行在任何Linux服務上。相同的容器,開發人員可以在筆記本上有規模的運行、生產、也可以在虛擬機器、邏輯伺服器、OpenStack叢集、公用執行個體、或以上所有結合(的方式)上運行。
換句話說,開發人員構建的應用只需一次構建即可多平台運行。運營人員只需配置他們的服務,即可運行所有的應用。
Docker的主要功能特徵
|
物理容器 |
Docker |
內容無關性(Content Agnostic) |
相同的集裝箱可以容納幾乎任何類型的貨物 |
可以封裝任何承載及其依賴項 |
硬體無關性(Hardware Agnostic) |
同一標準的容器允許把貨物從船上運輸到火車、卡車上,直到運輸到倉庫,整個過程無需整理貨物或開啟容器 |
使用作業系統基元(例如:LXC)幾乎可以在任何平台上運行——虛擬機器、裸機、OpenStack、公用IaaS等,並且無需修改 |
內容隔離和互動 |
無需擔心鐵壓在香蕉上,容器可以堆積運輸 |
資源、網路和內容隔離,避免依賴地獄 |
自動化 |
標準的介面使其易於實現自動化裝卸、搬運等 |
運行、啟動、停止、提交、搜尋等都有標準的操作,非常適合devops:CI、CD、自動擴充、混合雲 |
高效 |
無需開啟或修改,可以在起始兩地快速地移動/運輸 |
輕量級、幾乎沒有任何偏向和啟動懲罰,可以進行快速移動和操作 |
職責分離 |
託運人擔心盒子內部、承運人擔心盒子外部 |
開發人員擔心代碼,運營人員擔心基礎設施 |
更多技術特性:
- 檔案系統隔離:每個進程容器都運行在一個完全獨立的根檔案系統裡;
- 資源隔離:系統資源,例如CPU、記憶體等,使用cgroups分配在不同的流程容器裡;
- 網路隔離:每個進程容器攜帶自身的一個虛擬介面和IP地址運行在自己的網路空間;
- 即寫即拷(Copy-on-write):使用即寫即拷方式建立根檔案系統,這樣部署速度極快、記憶體和硬碟空間極少;
- 日誌:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用於即時檢索或批量檢索;
- 變更管理:容器檔案系統的變更可以提交到新的映像(image)中,並可重複使用以建立更多的容器。無需使用模板或手動設定;
- 互動式shell:Docker可以分配一個虛擬終端並關聯到任何容器的標準輸入上,例如運行一個一次性互動shell。
Docker有哪些準系統?
Docker讓開發和營運變的簡單。下面這幅圖會讓你對Docker準系統有個很好的認識,Docker會將網路,儲存這些事情都配好。下載應用並安裝。並配置一些參數,打包上傳Image。此外,Container既可以手動建立,也可以自動建立,如果源碼庫裡麵包涵DockerFile檔案,那麼將會自動建立,容器裡不僅包涵應用,還包括應用的所有依賴項。
開發人員可以使用Docker Search命令在Docker Registry(無論是公有還是私人的)裡搜尋Containers,並且還可以使用Docker Pull命令從註冊表裡推送Container,使用Docker Run命令執行啟動、運行、停止等操作。值得注意的是,Run命令的對象可能是你自己的伺服器、公用執行個體或者是兩者的組合。
圖7 Docker的準系統
關於Docker的完整功能列表,大家可以訪問: http://docs.docker.io/en/latest/commandline/
Docker的三種運行方式:作為守護進程,在Linux主機上管理LXC容器;作為一個CLI,與守護進程的REST API進行對話(docker run ...);作為倉庫的用戶端,分享你所構建的內容(docker pull, docker commit)。
Containers是如何工作的?與VMs有何不同?
一個Container通常包含應用及應用依賴項,Container用來隔離進程,這些進程主要運行在主機作業系統上的隔離區和使用者空間。
這個是明顯不同於傳統的VMs。傳統的硬體虛擬化(例如VMWare、KVM、Xen、EC2)旨在創造一個完整虛擬機器。每個虛擬化應用不僅包含應用的二進位檔案,還需運行該應用程式所需的庫、一個完整的Guest作業系統。
圖8 Containers vs. 傳統VMs
由於所有的容器共用同一個作業系統(以及二進位檔案和庫),所以,他們明顯要比VM小的多,這樣,就完全可以在一個物理主機上託管100個VMs(一般VM數量會受到嚴格限制)。此外,因為它們使用主機作業系統,重啟一個VM並不意味著要重啟作業系統,因此,容器更加輕便、高效。
Docker中的容器效率會更高。因為一個傳統的VM、應用、每個應用副本以及每個應用微小的變更都需要重新建立一個完整的VM。
如所示,一個新的應用在主機上僅僅包含應用及其二進位檔案/庫,這樣就無需建立一個新的客戶機作業系統。
如果你想在主機上運行該應用的幾個副本,你甚至無需複製共用的二進位檔案。
最後,即使你對應用進行了變更,你也無需拷貝變更內容。
圖9 Mechanism讓Docker容器更輕量
這不僅讓儲存和容器運行變得更高效,還讓應用程式更新變得極其簡便。正如所示,更新一個容器只需應用差異的地方。
圖10 修改和更新Container
下面分享一些比較酷的Docker用例
執行個體 |
執行個體描述 |
連結 |
構建自己的PaaS |
Dokku——Docker實現的mini-Heroku。你所見過最小的PaaS實現 |
http://bit.ly/191Tgsx |
基於指令環境的Web |
JiffyLab——基於指令環境的Web,使用更輕量、Python和UNIX shell |
http://bit.ly/12oaj2K |
應用部署簡便 |
使用Docker部署Java應用 在Docker上運行Drupal 在Docker上安裝Redis |
http://bit.ly/11BCvvu http://bit.ly/15MJS6B http://bit.ly/16EWOKh |
建立安全沙箱 |
Docker讓安全沙箱的建立更簡單 |
http://bit.ly/13mZGJH |
建立自己的SaaS |
把Memcached作為服務 |
http://bit.ly/11nL8vh |
應用程式自動化部署 |
使用Docker的Push-button部署 |
http://bit.ly/1bTKZTo |
持續整合部署 |
dotCloud的Docker和Strider的下一代持續整合&部署 |
http://bit.ly/ZwTfoy |
輕量級案頭虛擬化 |
Docker案頭:通過SSH運行一個內部Docker容器 |
http://bit.ly/14RYL6x |
相關資料:
- Docker官網
- Docker託管地址
- Docker入門教程
推薦閱讀:
俄羅斯搜尋霸主Yandex推出基於Docker的開源PaaS服務Cocaine
超越Google,他企圖將整個互連網塞進1台電腦
PaaS亂局:Container的新機遇
Docker:集裝箱式“運輸”在軟體上的實現