很明顯能夠看出二者在操做系統級別上的隔離和進程上的隔離的區別,VM由於隔離級別更高明顯更重。html
文件系統隔離:每一個容器都有本身的root文件系統
進程隔離:每一個容器都運行在本身的進程環境中
網絡隔離:容器件的虛擬網絡接口和IP地址都是分開的
資源隔離和分組:使用cgroup將CPU和內存之類的資源獨立分配給每一個容器linux
虛擬機 | 容器 | |
---|---|---|
隔離 | 提供與主機操做系統和其餘 VM 的徹底隔離。 當強安全邊界很關鍵時(例如,在同一臺服務器或羣集上託管來自競爭性公司的應用時),這頗有用。 | 一般提供與主機和其餘容器的輕度隔離,但不提供與 VM 同樣強的安全邊界。 (可使用 Hyper-V 隔離模式隔離輕型 VM 中的每一個容器,從而提升安全性。) |
操做系統 | 運行包含內核的完整操做系統,所以須要更多的系統資源(CPU、內存和存儲)。 | 運行操做系統的用戶模式部分,能夠對其進行定製,使之只包含應用所需的服務,減小所使用的系統資源。 |
來賓兼容性 | 運行虛擬機內的幾乎任何操做系統 | 在與主機相同的操做系統版本上運行(Hyper-V 隔離使你可以在輕型 VM 環境中運行同一 OS 的早期版本) |
部署 | 使用 Windows Admin Center 或 Hyper-V 管理器部署單個 VM;使用 PowerShell 或 System Center Virtual Machine Manager 部署多個 VM。 | 經過命令行使用 Docker 部署單個容器;使用 Azure Kubernetes 服務等業務流程協調程序部署多個容器。 |
操做系統更新和升級 | 在每一個 VM 上下載並安裝操做系統更新。 安裝新的操做系統版本須要升級;一般狀況下,直接建立全新 VM。 這樣可能很耗時,尤爲是在有大量 VM 的狀況下... | 在容器中更新或升級操做系統文件的操做是相同的: 編輯容器映像的生成文件(稱爲 Dockerfile),使之指向最新版 Windows 基礎映像。用這個新的基礎映像從新生成容器映像。將容器映像推送到容器註冊表。使用業務流程協調程序從新進行部署。 業務流程協調程序提供的強大的自動化功能容許大規模這樣作。 有關詳細信息,請參閱教程:在 Azure Kubernetes 服務中更新應用程序。 |
持久性存儲 | 對單個 VM 使用進行本地存儲的虛擬硬盤 (VHD),或對多個服務器共享的存儲使用 SMB 文件共享 | 使用 Azure 磁盤做爲單個節點的本地存儲,或將 Azure 文件存儲(SMB 共享)用於由多個節點或服務器共享的存儲。 |
負載平衡 | 虛擬機負載均衡將運行中的 VM 移動到故障轉移羣集中的其餘服務器。 | 容器自己不移動,而是由業務流程協調程序在羣集節點上自動啓動或中止容器,以管理負載和可用性方面的更改。 |
容錯 | VM 能夠故障轉移到羣集中的另外一臺服務器,並在新服務器上重啓 VM 的操做系統。 | 若是某個羣集節點發生故障,則在該節點上運行的全部容器都將在另外一個羣集節點上由業務流程協調程序快速從新建立。 |
網絡 | 使用虛擬網絡適配器。 | 使用虛擬網絡適配器的隔離視圖,在減小使用資源的同時,稍微減小提供的虛擬化 – 主機的防火牆與容器共享。 有關詳細信息,請參閱 Windows 容器網絡。 |
這篇文章對於docker入門,在docker架構方面的瞭解有很大的幫助,此等級標題下均爲該文章內容。git
http://www.javashuo.com/article/p-afavwoqh-ke.htmlgithub
Dockerfile是什麼:docker
前面咱們已經提到了 Docker
的一些基本概念。以 CTF
選手的角度來看,咱們能夠去使用 Dockerfile
定義鏡像,依賴鏡像來運行容器,能夠去模擬出一個真實的漏洞場景。所以毫無疑問的說, Dockerfile
是鏡像和容器的關鍵,而且 Dockerfile
還能夠很輕易的去定義鏡像內容,說了這麼多,那麼 Dockerfile
究竟是個什麼東西呢?shell
Dockerfile
是自動構建 docker
鏡像的配置文件, 用戶可使用 Dockerfile
快速建立自定義的鏡像。Dockerfile
中的命令很是相似於 linux
下的 shell
命令。windows
Docker鏡像只是一個自定義文件/目錄結構,經過一個或多個Dockerfiles的FROM和RUN指令以層的形式進行組裝,並帶有一些元數據(例如:打開哪一個端口或在容器啓動時執行哪一個文件),若是內核能夠運行守護程序(docker daemon),通常表明具備運行的一些通用API,這時若是鏡像中包含依賴內核最新的一些功能的軟件將沒法運行,但由於通用的API足以支持程序的最初啓動,Docker並不會阻止,由於它不在意鏡像中的內容和用哪一個內核的版原本啓動鏡像,其實通常本機的操做系統都是較新的(若對舊的內核的一些功能的引用沒用致使操做系統的BUG或被黑客攻擊的風險,通常到新的操做系統也會保留),因此,問題並不常見。安全
**OS ** =內核+文件系統/庫服務器
鏡像 =文件系統/庫
先下結論,如果爲了運行docker,因爲docker引擎是在Linux環境上開發的,因此在Linux上確定是效率更高的,可是在windows上的docker與Linux其實在hyper - v改善後難以看出明顯的差距。容器是一項存在好久的技術了,docker的精髓在將所須要的文件系統、依賴打包成了統一的一層docker image,結合微服務的思想的出現,適合於快速的開發交付,才得以發光。
docker = LXC(container)+docker image;
hyper 技術主要是爲了保護共享基於LXC和windows container而誕生的(Linux和windows都可採用相同原理的技術):
hyper = VM(輕型,沒有完整的操做系統下文連接有相關講述)+docker image;
在Windows server 2016上,微軟提供了兩種容器,Windows Server Container 和Hyper -V Container ,二者執行相同的操做並執行相同的方式管理,可是它們的隔離級別不一樣, 區別在於,在運行 Hyper-V 容器的映像中建立容器的方式須要使用其餘參數。Windows Server Container 和Linux Container(LIinux容器由來:https://developer.aliyun.com/article/745446) 同樣,容器與底層操做系統共享內核,因此它們會很輕量並且運行迅速。當你在容器中啓動一個進程的時候,這個進程實際上運行在宿主機上,你可使用任務管理器或者Powershell 命令 Get-Process 獲取到這個進程的信息。這使得它們比VM小,由於它們每一個都不須要操做系統的副本。可是,安全性可能會成爲一個問題,由於若是一個容器遭到破壞,則OS和全部其餘容器都將受到威脅。Windows 10上雖然也提供了容器服務,可是隻能運行Hyper-V Contianer。
Linux是依據其操做系統的CGroup(https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html)進行進程級別的分離,即LXC(Linux Container),而windows由於沒有像Linux的開源性那麼方便,但也提供了Windows Server Container 以提供跟LXC同樣的功能,但都有共享同個內核所涉及的安全性問題,因此windows在win10上只Hyper-V容器所提供的進程隔離與虛擬機與物理機的隔離保證安全性,並且docker的Engine須要Linux,因此windows環境下運行docker本就須要Linux的虛擬環境。
Windows 映像僅能在 Windows 主機上運行(多是Linux原本就快,並且windows有電腦的人基本都有,因此不必去Linux上測試,還不如在windows程序中運行,Linux鏡像能夠在windows上運行多是爲了能一塊兒開發測試用吧),Linux 映像能夠在 Linux 主機和 Windows 主機上運行(在 Hyper-V 上運行的基於 LinuxKit 的虛擬機在 Windows 桌面上運行 Linux 容器)(https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/linux-containers),其中主機是指服務器或 VM。由於Windows用到docker daemon 時,其Engine是依據Linux啓動的,因此咱們運行Linux的鏡像時還是經過Hyper-V虛擬機實現了Linux 環境,而且提供了Hyper-V的專用容器而已。因此通常在windows進行開發與測試
固然,微軟這麼大的一家公司,不會這麼將就,查資料時發現Hyper 是一項輕量級VM+docker image 的技術,能夠用來解決LXC共享內核所帶來的安全問題:其中涉及到進程隔離和Hyper -V隔離(下面三幅圖爲微軟官網對於容器區別的展現),Linux可能也用Hyper技術實現隔離,可是如果在windows中運行Linux鏡像,這時已經經過Hyper-V上的LinuxKit虛擬機上運行了host,就不須要在上面再加一層了,直接用LXC便可。
這是容器的「傳統」隔離模式,Windows 容器概述中介紹了這種模式。 使用進程隔離時,能夠經過命名空間、資源控制以及進程隔離技術進行隔離,這樣多個容器實例就能夠同時在給定主機上運行。 在此模式下運行時,容器與主機之間以及容器與容器之間會共享同一個內核。 這大體與 Linux 容器的運行方式相同。
此隔離模式在主機和容器版本之間提供加強的安全性和更普遍的兼容性。 使用 Hyper-V 隔離時,多個容器實例在主機上併發運行;可是,每一個容器在高度優化的虛擬機中運行,並有效地得到本身的內核。 因爲虛擬機的存在,所以能夠在每一個容器之間以及容器與容器主機之間進行硬件級別的隔離。
至於二者的由來以及與Docker的區別,能夠看下面兩篇文章(包括Hyper在如何輕量級的思路:1加快容器啓動速度(精簡VM配置和內核、VM Cache功能) 2.下降內存開銷):
Swarm是Docker提供的容器編排平臺,從1.12版本開始,任何的服務器節點均可以加入Swarm集羣,這一樣適用於Windows服務器。所以,你能夠在一個Swarm集羣中混合部署Windows和Linux節點,雖然不一樣的操做系統節點上只能運行對應的容器,可是它們均可以經過swarm network進行通信,構建一個完整的應用。
對於微服務拆分來講,能夠構建跨平臺的分佈式應用很是具備吸引力。若是你的應用如今是一個傳統的asp.net單體應用,你能夠先採用microsoft/windowservercore鏡像對整個單體應用進行容器化部署,而後逐步的將其中的某些組件進行拆分,使用microsoft/nanoserver上的.net core來運行這些微服務組件,你甚至能夠引入nginx做爲你的反向代理服務器,並將其運行在linux服務器節點上。
兩篇文章對一些其中的基本使用狀況有了較好的概述: