docker入門、LXC、windows container 和 Hyper知識基礎、實用情況

虛擬機與容器

很明顯可以看出兩者在作業系統級別上的隔離和進程上的隔離的區別,VM因為隔離級別更高明顯更重。

2.png

linux容器主要技術特點:

文件系統隔離:每個容器都有自己的root文件系統
進程隔離:每個容器都運行在自己的進程環境中
網路隔離:容器件的虛擬網路介面和IP地址都是分開的
資源隔離和分組:使用cgroup將CPU和記憶體之類的資源獨立分配給每個容器

windows容器主要特點:

//docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/system-requirements)

虛擬機 容器
隔離 提供與主機作業系統和其他 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 容器網路

windows授權機制:

windows-container-4

docker 入門:

這篇文章對於docker入門,在docker架構方面的了解有很大的幫助,此等級標題下均為該文章內容。

//www.cnblogs.com/ECJTUACM-873284962/p/9789130.html

img

docker-framework

img

img

Dockerfile是什麼:

前面我們已經提到了 Docker 的一些基本概念。以 CTF 選手的角度來看,我們可以去使用 Dockerfile 定義鏡像,依賴鏡像來運行容器,可以去模擬出一個真實的漏洞場景。因此毫無疑問的說, Dockerfile 是鏡像和容器的關鍵,並且 Dockerfile 還可以很輕易的去定義鏡像內容,說了這麼多,那麼 Dockerfile 到底是個什麼東西呢?

Dockerfile 是自動構建 docker 鏡像的配置文件, 用戶可以使用 Dockerfile 快速創建自定義的鏡像。Dockerfile 中的命令非常類似於 linux 下的 shell 命令。

關於不同版本的內核的對於鏡像的影響

​ Docker鏡像只是一個自定義文件/目錄結構,通過一個或多個Dockerfiles的FROM和RUN指令以層的形式進行組裝,並帶有一些元數據(例如:打開哪個埠或在容器啟動時執行哪個文件),如果內核可以運行守護程式(docker daemon),一般代表具有運行的一些通用API,這時如果鏡像中包含依賴內核最新的一些功能的軟體將無法運行,但因為通用的API足以支援程式的最初啟動,Docker並不會阻止,因為它不在乎鏡像中的內容和用哪個內核的版本來啟動鏡像,其實一般本機的作業系統都是較新的(若對舊的內核的一些功能的引用沒用導致作業系統的BUG或被黑客攻擊的風險,一般到新的作業系統也會保留),所以,問題並不常見。

**OS ** =內核+文件系統/庫

鏡像 =文件系統/庫

關於docker for windows 10 和 docker for Linux

先下結論,若是為了運行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容器由來://developer.aliyun.com/article/745446) 一樣,容器與底層作業系統共享內核,所以它們會很輕量而且運行迅速。當你在容器中啟動一個進程的時候,這個進程實際上運行在宿主機上,你可以使用任務管理器或者Powershell 命令 Get-Process 獲取到這個進程的資訊。這使得它們比VM小,因為它們每個都不需要作業系統的副本。但是,安全性可能會成為一個問題,因為如果一個容器遭到破壞,則OS和所有其他容器都將受到威脅。Windows 10上雖然也提供了容器服務,但是只能運行Hyper-V Contianer。

​ Linux是依據其作業系統的CGroup(//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 容器)(//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即可。

Moby VM 作為容器主機

進程隔離

這是容器的「傳統」隔離模式,Windows 容器概述中介紹了這種模式。 使用進程隔離時,可以通過命名空間、資源控制以及進程隔離技術進行隔離,這樣多個容器實例就可以同時在給定主機上運行。 在此模式下運行時,容器與主機之間以及容器與容器之間會共享同一個內核。 這大致與 Linux 容器的運行方式相同。

img

Hyper-V 隔離

此隔離模式在主機和容器版本之間提供增強的安全性和更廣泛的兼容性。 使用 Hyper-V 隔離時,多個容器實例在主機上並發運行;但是,每個容器在高度優化的虛擬機中運行,並有效地獲得自己的內核。 由於虛擬機的存在,因此可以在每個容器之間以及容器與容器主機之間進行硬體級別的隔離。

img

兩者的區別

windows-container-1

容器編排平台

Swarm是Docker提供的容器編排平台,從1.12版本開始,任何的伺服器節點都可以加入Swarm集群,這同樣適用於Windows伺服器。因此,你可以在一個Swarm集群中混合部署Windows和Linux節點,雖然不同的作業系統節點上只能運行對應的容器,但是它們都可以通過swarm network進行通訊,構建一個完整的應用。

對於微服務拆分來說,可以構建跨平台的分散式應用非常具有吸引力。如果你的應用現在是一個傳統的asp.net單體應用,你可以先採用microsoft/windowservercore鏡像對整個單體應用進行容器化部署,然後逐步的將其中的某些組件進行拆分,使用microsoft/nanoserver上的.net core來運行這些微服務組件,你甚至可以引入nginx作為你的反向代理伺服器,並將其運行在linux伺服器節點上。

windows-container-3

實用中的使用情況

兩篇文章對一些其中的基本使用情況有了較好的概述:

//www.cnblogs.com/daxnet/p/7719574.html

//www.zhihu.com/question/51134842