Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的Linux機器上,也能夠實現虛擬化,容器是徹底使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有如下幾個部分組成: dockerClient客戶端 Docker Daemon守護進程 Docker Image鏡像 DockerContainer容器
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和建立Docker容器。Docker 容器經過 Docker 鏡像來建立。容器與鏡像的關係相似於面向對象編程中的對象與類。
docker | 面向對象 |
容器 | 對象 |
鏡像 | 類 |
Docker採用 C/S架構 Docker daemon 做爲服務端接受來自客戶的請求,並處理這些請求(建立、運行、分發容器)。 客戶端和服務端既能夠運行在一個機器上,也可經過 socket 或者RESTful API 來進行通訊。 Docker daemon 通常在宿主主機後臺運行,等待接收來自客戶端的消息。 Docker 客戶端則爲用戶提供一系列可執行命令,用戶用這些命令實現跟 Docker daemon 交互。
在docker的網站上提到了docker的典型場景: Automating the packaging and deployment of applications(使應用的打包與部署自動化) Creation of lightweight, private PAAS environments(建立輕量、私密的PAAS環境) Automated testing and continuous integration/deployment(實現自動化測試和持續的集成/部署) Deploying and scaling web apps, databases and backend services(部署與擴展webapp、數據庫和後臺服務) 因爲其基於LXC的輕量級虛擬化的特色,docker相比KVM之類最明顯的特色就是啓動快,資源佔用小。所以對於構建隔離的標準化的運行環境,輕量級的PaaS(如dokku), 構建自動化測試和持續集成環境,以及一切能夠橫向擴展的應用(尤爲是須要快速啓停來應對峯谷的web應用)。 1.構建標準化的運行環境,現有的方案大可能是在一個baseOS上運行一套puppet/chef,或者一個image文件,其缺點是前者須要base OS許多前提條件,後者幾乎不能夠修改(由於copy on write 的文件格式在運行時rootfs是read only的)。而且後者文件體積大,環境管理和版本控制自己也是一個問題。 2.PaaS環境是不言而喻的,其設計之初和dotcloud的案例都是將其做爲PaaS產品的環境基礎 3.由於其標準化構建方法(buildfile)和良好的REST API,自動化測試和持續集成/部署可以很好的集成進來 4.由於LXC輕量級的特色,其啓動快,並且docker可以只加載每一個container變化的部分,這樣資源佔用小,可以在單機環境下與KVM之類的虛擬化方案相比可以更加快速和佔用更少資源
Docker是基於Linux 64bit的,沒法在32bit的linux/Windows/unix環境下使用 LXC是基於cgroup等linux kernel功能的,所以container的guest系統只能是linux base的 隔離性相比KVM之類的虛擬化方案仍是有些欠缺,全部container公用一部分的運行庫 網絡管理相對簡單,主要是基於namespace隔離 container隨着用戶進程的中止而銷燬,container中的log等用戶數據不便收集 Docker對disk的管理比較有限 Docker並不是適合全部應用場景,Docker只能虛擬基於Linux的服務。Windows Azure 服務可以運行Docker實例,但到目前爲止Windows服務還不能被虛擬化。 可能最大的障礙在於管理實例之間的交互。因爲全部應用組件被拆分到不一樣的容器中,全部的服務器須要以一致的方式彼此通訊。這意味着任何人若是選擇複雜的基礎設施,那麼必須掌握應用編程接口管理以及集羣工具,好比Swarm、Mesos或者Kubernets以確保機器按照預期運轉並支持故障切換。 Docker在本質上是一個附加系統。使用文件系統的不一樣層構建一個應用是有可能的。每一個組件被添加到以前已經建立的組件之上,能夠比做爲一個文件系統更明智。分層架構帶來另外一方面的效率提高,當你重建存在變化的Docker鏡像時,不須要重建整個Docker鏡像,只須要重建變化的部分。 可能更爲重要的是,Docker旨在用於彈性計算。每一個Docker實例的運營生命週期有限,實例數量根據需求增減。在一個管理適度的系統中,這些實例生而平等,再也不須要時便各自消亡了。 針對Docker環境存在的不足,意味着在開始部署Docker前須要考慮以下幾個問題。首先,Docker實例是無狀態的。這意味着它們不該該承載任何交易數據,全部數據應該保存在數據庫服務器中。 其次,開發Docker實例並不像建立一臺虛擬機、添加應用而後克隆那樣簡單。爲成功建立並使用Docker基礎設施,管理員須要對系統管理的各個方面有一個全面的理解,包括Linux管理、編排及配置工具好比Puppet、Chef以及Salt。這些工具生來就基於命令行以及腳本。
參考資料:linux
https://baike.baidu.com/item/Docker/13344470?fr=aladdin#reference-[3]-12232642-wrap