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

来源:https://www.cnblogs.com/eternal-heathens/archive/2020/07/08/13266740.html
-Advertisement-
Play Games

虛擬機與容器 很明顯可以看出兩者在操作系統級別上的隔離和進程上的隔離的區別,VM因為隔離級別更高明顯更重。 linux容器主要技術特點: 文件系統隔離:每個容器都有自己的root文件系統 進程隔離:每個容器都運行在自己的進程環境中 網路隔離:容器件的虛擬網路介面和IP地址都是分開的 資源隔離和分組: ...


虛擬機與容器

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

2.png

linux容器主要技術特點:

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

windows容器主要特點:

https://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架構方面的瞭解有很大的幫助,此等級標題下均為該文章內容。

https://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容器由來: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即可。

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


實用中的使用情況

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

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

https://www.zhihu.com/question/51134842


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 Http我們都已經耳熟能詳了,而關於Http學習的文章網上有很多,各個知識點的講解也可說是深入淺出。然而,學習過後,我們對Http還是一知半解。問題出在了哪? Http是一個客戶機與伺服器之間的通信的協議,真的想學習Http,就必須把客戶機和伺服器也學了,也就是說,必須立體的學習,不然我們永遠 ...
  • 一.背景說明: 之前分享過一個微服務開發框架, “享一個集成.NET Core+Swagger+Consul+Polly+Ocelot+IdentityServer4+Exceptionless+Apollo+SkyWalking的微服務開發框架”,前兩天在Github上收到一個Issues,是想我 ...
  • 本次課程就正式進入開發部分。 首先我們先搭建項目框架,還是和之前漸進式風格保持一致,除必備組件外,儘量使用原生功能以方便大家理解。 開發工具:vs 2019 或以上 資料庫:SQL SERVER 2017 或以上 其他需要用到的我們在項目過程中再提。 一、新建 MVC項目 1、打開VS 2019,C ...
  • 調試腳本所花費的時間常常比編寫代碼還要多。所有編程語言都應該實現的一個特性就是在出現始料未及的情況時,能夠生成跟蹤信息。調試信息可以幫你弄清楚是什麼原因使得程式行為異常。 ...
  • 大家好,我是良許。 我們在平時工作的時候,經常要知道兩個文件之間,以及同個文件不同版本之間有何異同點。在 Windows 下,有 beyond compare 這個好用的工具,而在 Linux 下,也有很多很強大的工具,良許之前也寫過一篇文章介紹: Linux下9種優秀的代碼比對工具推薦 這些比對工 ...
  • [導讀] 前文大致總結了單片機串口的一些值得註意的要點,本文來梳理一下I2C匯流排的一些應用要點。這個題目有點大,對於I2C其實很多地方也沒講清楚,只為了與前文形成系列,如果大家有補充歡迎留言。說了些閑話,進入正題吧。 I2C之前世今生 \(I^2C\)(Inter-Integrated Circui ...
  • [導讀] 單片機開發串口是應用最為廣泛的通信介面,也是最為簡單的通信介面之一,但是其中的一些要點你是否明瞭呢?來看看本人對串口的一些總結,當然這個總結並不能面面俱到,只是將個人認為具有共性以及相對比較重要的點做了些梳理。 啥是串口? 首先這玩意兒分兩種: **通用非同步收發器(UART)**是用於非同步 ...
  • 1. Shell 腳本的第一行時指定腳本解釋器。 #!/bin/bash 或者 #!/bin/sh 2. Shell 腳本的開頭會加版本,版權等信息 #!/bin/bash #Author: iskylite #Blog: http://www.cnblogs.com/iskylite/ #Date ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...