docker入門、LXC、windows container 和 Hyper知識基礎、實用情況
阿新 • • 發佈:2020-07-08
## 虛擬機器與容器
很明顯可以看出兩者在作業系統級別上的隔離和程序上的隔離的區別,VM因為隔離級別更高明顯更重。
![2.png](http://dockone.io/uploads/article/20190701/71387961c24673bbc9ec8eda5361bae3.png)
#### linux容器主要技術特點:
檔案系統隔離:每個容器都有自己的root檔案系統
程序隔離:每個容器都執行在自己的程序環境中
網路隔離:容器件的虛擬網路介面和IP地址都是分開的
資源隔離和分組:使用cgroup將CPU和記憶體之類的資源獨立分配給每個容器
#### windows容器主要特點:
(https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/system-requirements)
| | 虛擬機器 | 容器 |
| :----------------- | :----------------------------------------------------------- | ------------------------------------------------------------ |
| 隔離 | 提供與主機作業系統和其他 VM 的完全隔離。 當強安全邊界很關鍵時(例如,在同一臺伺服器或群集上託管來自競爭性公司的應用時),這很有用。 | 通常提供與主機和其他容器的輕度隔離,但不提供與 VM 一樣強的安全邊界。 (可以使用 [Hyper-V 隔離模式](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-containers/hyperv-container)隔離輕型 VM 中的每個容器,從而提高安全性。) |
| 作業系統 | 執行包含核心的完整作業系統,因此需要更多的系統資源(CPU、記憶體和儲存)。 | 執行作業系統的使用者模式部分,可以對其進行定製,使之只包含應用所需的服務,減少所使用的系統資源。 |
| 來賓相容性 | 執行虛擬機器內的幾乎任何作業系統 | 在[與主機相同的作業系統版本](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/version-compatibility)上執行(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 服務中更新應用程式](https://docs.microsoft.com/zh-cn/azure/aks/tutorial-kubernetes-app-update)。 |
| 永續性儲存 | 對單個 VM 使用進行本地儲存的虛擬硬碟 (VHD),或對多個伺服器共享的儲存使用 SMB 檔案共享 | 使用 Azure 磁碟作為單個節點的本地儲存,或將 Azure 檔案儲存(SMB 共享)用於由多個節點或伺服器共享的儲存。 |
| 負載平衡 | 虛擬機器負載均衡將執行中的 VM 移動到故障轉移群集中的其他伺服器。 | 容器本身不移動,而是由業務流程協調程式在群集節點上自動啟動或停止容器,以管理負載和可用性方面的更改。 |
| 容錯 | VM 可以故障轉移到群集中的另一臺伺服器,並在新伺服器上重啟 VM 的作業系統。 | 如果某個群集節點發生故障,則在該節點上執行的所有容器都將在另一個群集節點上由業務流程協調程式快速重新建立。 |
| 網路 | 使用虛擬網路介面卡。 | 使用虛擬網路介面卡的隔離檢視,在減少使用資源的同時,稍微減少提供的虛擬化 – 主機的防火牆與容器共享。 有關詳細資訊,請參閱 [Windows 容器網路](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/container-networking/architecture)。 |
#### windows授權機制:
---------------
## docker 入門:
這篇文章對於docker入門,在docker架構方面的瞭解有很大的幫助,此等級標題下均為該文章內容。
https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html
![img](https://img2018.cnblogs.com/blog/1100338/201810/1100338-20181010205425908-509725301.jpg)
![docker-framework](https://img2018.cnblogs.com/blog/1100338/201810/1100338-20181011200343656-1972949758.png)
![img](https://img2018.cnblogs.com/blog/1100338/201810/1100338-20181012214101184-1339527466.jpg)
![img](https://img2018.cnblogs.com/blog/1100338/201810/1100338-20181014202945937-1677031749.png)
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容器由來: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](https://github.com/linuxkit/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即可。
![Moby VM 作為容器主機](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/media/mobyvm.png)
#### 程序隔離
這是容器的“傳統”隔離模式,[Windows 容器概述](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/about/)中介紹了這種模式。 使用程序隔離時,可以通過名稱空間、資源控制以及程序隔離技術進行隔離,這樣多個容器例項就可以同時在給定主機上執行。 在此模式下執行時,容器與主機之間以及容器與容器之間會共享同一個核心。 這大致與 Linux 容器的執行方式相同。
![img](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-containers/media/container-arch-process.png)
#### Hyper-V 隔離
此隔離模式在主機和容器版本之間提供增強的安全性和更廣泛的相容性。 使用 Hyper-V 隔離時,多個容器例項在主機上併發執行;但是,每個容器在高度優化的虛擬機器中執行,並有效地獲得自己的核心。 由於虛擬機器的存在,因此可以在每個容器之間以及容器與容器主機之間進行硬體級別的隔離。
![img](https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-containers/media/container-arch-hyperv.png)
#### 兩者的區別
![windows-container-1](http://devopshub.cn/wp-content/uploads/2017/02/windows-container-1.png)
* 至於兩者的由來以及與Docker的區別,可以看下面兩篇文章(包括Hyper在如何輕量級的思路:1加快容器啟動速度(精簡VM配置和核心、VM Cache功能) 2.降低記憶體開銷):
> http://dockone.io/article/1570
>
> https://cloud.tencent.com/developer/article/1042662
--------
## 容器編排平臺
Swarm是Docker提供的容器編排平臺,從1.12版本開始,任何的伺服器節點都可以加入Swarm叢集,這同樣適用於Windows伺服器。因此,你可以在一個Swarm叢集中混合部署Windows和Linux節點,雖然不同的作業系統節點上只能執行對應的容器,但是它們都可以通過**swarm network進行通訊**,構建一個完整的應用。
對於微服務拆分來說,可以構建跨平臺的分散式應用非常具有吸引力。如果你的應用現在是一個傳統的asp.net單體應用,你可以先採用microsoft/windowservercore映象對整個單體應用進行容器化部署,然後逐步的將其中的某些元件進行拆分,使用microsoft/nanoserver上的.net core來執行這些微服務元件,你甚至可以引入nginx作為你的反向代理伺服器,並將其執行在linux伺服器節點上。
![windows-container-3](http://devopshub.cn/wp-content/uploads/2017/02/windows-container-3.png)
-------------
## 實用中的使用情況
兩篇文章對一些其中的基本使用情況有了較好的概述:
https://www.cnblogs.com/daxnet/p/7719574.html
https://www.zhihu.com/question/