Docker是由PaaS提供商dotCloud在2013年年初建立的一款開源應用引擎,Docker能夠自動將任何應用打包成輕量、可移植、自包涵的容器引擎。開發者構建的應用能夠一次構建全平臺運行,包括本地開發機器,生產環境,虛擬機和雲等。git
Docker基於Go語言開發,代碼託管在 Github上,並遵循Apache 2.0開源協議。近期,這個項目獲得了愈來愈多的用戶追捧,Github上的Star數已經9000多,Google的Compute Engine也支持 Docker,而在國內,知名的 百度也把Docker做爲其Paas的基礎。github
來自Docker官方博客docker
Docker容器能夠封裝任何有效負載,幾乎能夠在任何服務器之間進行一致性運行。shell
Docker的經常使用案例包括:數據庫
背景後端
十五年前,幾乎全部的應用都是採用定義良好的堆棧編寫,而且部署到單一的專有服務器上。今天,開發人員可使用現成的最佳服務組合構建和裝配應用程序,而且爲這些應用程序進行跨不一樣硬件環境的多重部署作好了準備,包括公共的、私有的和虛擬化的服務器。安全
圖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、自動擴展、混合雲 |
高效 | 無需打開或修改,能夠在起始兩地快速地移動/運輸 | 輕量級、幾乎沒有任何偏向和啓動懲罰,能夠進行快速移動和操做 |
職責分離 | 託運人擔憂盒子內部、承運人擔憂盒子外部 | 開發人員擔憂代碼,運營人員擔憂基礎設施 |
更多技術特性:
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 |
相關資料:
推薦閱讀: