# 容器是什麼? <font size=6 color=red>容器化是OS的虛擬化技術</font>,它允許應用程序及其依賴項打包在稱為容器的標準化單元中。這種技術提供了一種輕量級的替代方案,相較於傳統的虛擬機方式,它在操作系統層面上進行隔離,而不需要大量的操作系統。 ### 開發環境演進 ![image](https://hackmd.io/_uploads/Skl7UWmNp.png) ------ ## <font color=blue face=粉圓體>VM vs. Container</font> ![image](https://hackmd.io/_uploads/r13SFUYr0.png) ![8a9e5d2f-4b77-40d0-b0bc-c2d7c3c7c984.jpg](https://hackmd.io/_uploads/ryVeTXc7p.jpg) - 左邊: 顯示了一台物理服務器上堆疊著多個虛擬機(VM)。每一個虛擬機都包含了一個完整的操作系統、中間件以及應用程式。這種設置每個虛擬機都需要一份操作系統的完整副本,這樣會占用更多的資源。 容器虛擬化 - 右邊: 同樣是在一台物理服務器上,但運行著一個容器引擎(如 Docker),這個引擎上運行著多個容器。這些容器共享宿主機的操作系統核心,但每個容器內只包含其應用程式和二進位檔。這減少了每個工作負載所需要的操作系統數量,從而節省資源並提高效率。 ## 虛擬化種類 1. 硬體虛擬化:這是最常見的虛擬化形式。它通過在物理硬體和操作系統之間插入一層虛擬層來工作。這層虛擬層(通常是虛擬機監視器,如VMware ESXi或KVM)能夠讓多個操作系統同時在單一硬體平台上運行。 ![image](https://hackmd.io/_uploads/S1gLxBlUa.png) 2. <font color=Blue>操作系統虛擬化</font>:這種虛擬化涉及到將單一物理服務器的操作系統分割成多個隔離的虛擬環境(稱為容器或輕量級虛擬化)。Docker和Kubernetes是這種虛擬化技術的著名例子。 ![image](https://hackmd.io/_uploads/rJAmgrlU6.png) ### 容器的虛擬化主要依賴於操作系統層面的技術,與傳統的基於硬件的虛擬化(如虛擬機)不同。容器虛擬化的關鍵技術包括: - 1. <font color=blue>(Namespaces):</font> 命名空間是 Linux 核心的一個特性,它為容器提供了一個隔離的視圖,包括文件系統、網絡配置、用戶 ID 等。每個容器都在自己的命名空間中運行,從而保證了容器之間的隔離。 - 2. <font color=blue>控制組(Cgroups):</font> 控制組是另一個 Linux 核心特性,用於限制、記賬和隔離資源使用(CPU、內存、磁盤 I/O 等)。通過控制組,系統管理員可以管理容器使用的資源,防止單個容器佔用過多資源。 - 3. <font color=blue>容器引擎:</font> 最著名的例子是 Docker,它提供了容器的創建、運行和管理的工具。容器引擎在名字空間和控制組的基礎上運行,管理容器的生命周期。 - 4. <font color=blue>映像層(Image Layers):</font> 容器映像通常由多個層組成,每一層都是文件系統的一部分。這些層被堆疊在一起形成一個完整的容器映像。這種分層架構使得映像共享和重用變得更加高效。 - 5. <font color=blue>聯合文件系統(Union File Systems):</font> 這是一種特殊的文件系統,允許多個不同的文件系統被掛載在同一個目錄下,同時呈現出一個統一的文件系統視圖。這對於創建和管理容器映像的分層非常關鍵。 - 容器技術通過這些方法實現了比傳統虛擬機更加輕量級的虛擬化,且具有更高的效率和靈活性。 3. 應用程式虛擬化:這種類型的虛擬化專注於將應用程式從它們運行的底層操作系統中分離出來。這允許應用程式在沒有安裝它們的情況下在任何支援的系統上運行。 4. 桌面虛擬化:通過桌面虛擬化,用戶可以在遠端服務器上存取和操作虛擬桌面。這種類型的虛擬化適用於遠端工作和資源共享。 5. 網路虛擬化:在網路虛擬化中,將可用的網路資源(如帶寬、網路連接等)分割成多個獨立的網路通道或路徑,這些路徑可以被不同的應用程式或服務使用。 6. 儲存虛擬化:這涉及將來自多個網路儲存設備的儲存資源合併為一個統一的儲存池。這使得儲存管理更加靈活和高效。 ![image](https://hackmd.io/_uploads/HkXlgSxUT.png) ## container runtime (engine) - 容器講的是裡面的環境,image就是容器的最小單位 - 包含了運行某個應用所需的一切:代碼、運行時環境、庫、環境變數和配置文件。 ˙![image](https://hackmd.io/_uploads/B15qKItS0.png) ## 容器image包含以下元素: 1. 應用程式代碼: 所有應用程式的源代碼或者二進制文件。 2. runtime: 任何特定於應用的運行時需求,比如 Java 運行時環境(JRE)對於一個 Java 應用。 3. 程式庫: 應用運行所需的所有依賴項,比如 DLL 檔案對於 Windows 應用或 .so 檔案對於 Linux 應用。 4. 環境變數: 應用運行所需的設定,這些可能在容器啟動時被設定。 5. 配置文件: 這些文件提供了關於如何運行應用的導引,包括端口設定、日誌級別等。 容器 images 是不可變的,意味著一旦創建,其內容就不會更改。這確保了應用的一致性和可移植性,因為相同的 image 可以在不同的計算環境中以相同的方式運行。 容器技術使用這些 images 來創建容器,這些容器是在特定的主機 OS 上運行的隔離的應用實例。這樣可以快速、輕鬆地部署和擴展應用,同時提供一致的運行環境。 ## 容器的單元<font size=6> <font color=green>i</font><font color=red>m</font><font color=purple>a</font><font color=blue>g</font><font color=orange>e</font></font> ![DALL·E 2023-11-13 13.12.23 - Illustrate a concept diagram for an image registry in the context of containerization. The diagram should include a central repository symbol labeled ](https://hackmd.io/_uploads/S1NWJukE6.jpg) - 容器化環境中的映像倉庫(image registry)概念圖。中央倉庫符號標記為“Image Registry”,有多個箭頭從不同的容器指向它,象徵著容器映像的儲存和管理。此外,從映像倉庫到伺服器或雲符號的箭頭代表著映像到各種部署環境的分發。這張圖強調了映像倉庫作為一個集中管理容器映像的樞紐,這些映像可以被不同的伺服器或雲平台拉取並運行。 <font size=6 color=green>Image Registry = APP store / Google store</font> ## 容器的佈署單元 <font size=6 color=red>P</font><font size= 6 color=blue>o</font><font size=6 color=green>d</font><font color=purple>s</font>-容器的容器 ![DALL·E 2023-11-15 15.16.14 - An imaginative concept of a USB-themed container. The container is designed to look like a USB flash drive, significantly enlarged to emphasize its fe](https://hackmd.io/_uploads/BJT89gMNp.jpg) ![pods](https://hackmd.io/_uploads/By_E4fJVT.jpg) "Pod" 標籤的大圓圈內包含了多個較小的圓圈,代表著Pod內的容器。這些容器內部標有應用程式、函式庫和依賴關係的圖示或標籤。還展示了用於持久化數據存儲的共享券和用於連接性的網絡接口。該圖強調了Pod內容器之間的共享資源和互連性。 ## 快速佈署 ex:滑鼠拔掉,帶到新電腦,插上去就能用了 在容器開發的軟體,因為容器就是環境,從Emily的容器開發了一款俄羅斯方塊,帶到Barbie的電腦就可以直接玩了. Q:每個人的電腦都可以玩?現在因為遊戲開發的環境大多為了windows的"環境"設計所以大多都能相"容",這個容=容器=環境 ## 優點 以下是容器化的一些關鍵特點: ### 1. **隔離性** - 每個容器內的應用程序都在自己的環境中運行,與系統上的其他容器相互隔離。 ![image.png](https://hackmd.io/_uploads/Bk184r9mT.png) 可以看到host os 肚子裡面也有container 這就是意謂著容器共享宿主機的資源,cpu,memory - 宿主操作系統(Host OS):大矩形代表宿主操作系統,它是運行所有容器的物理或虛擬主機的操作系統。 - 容器:宿主操作系統上的一系列小矩形代表容器,每個容器都被標記並編號,例如“Container 1”, “Container 2”, 以此類推。這些容器內部包含代表應用程序的圖標,可能是為了顯示它們運行的各種應用。 - 隔離性象徵:每個容器上的小鎖圖標強調了隔離性。這意味著每個容器內部的應用程序和服務都在自己的環境中運行,它們彼此隔離,不會互相影響。 - 空間分佈:容器在宿主操作系統上的分佈顯示了它們之間的物理和邏輯分離。它們並沒有重疊,這象徵著它們運行在隔離的環境中,即使它們共享相同的宿主操作系統。 - 總的來說,圖中的布局和圖標傳達了容器提供的隔離層次,這是現代雲計算和應用部署中的一個關鍵特性。這種隔離保障了應用的安全性,並使得每個容器能夠獨立地部署和擴展。 ### 2. **輕量級** - 容器共享主機操作系統的內核,不需要像傳統虛擬機一樣模擬整個操作系統,這使得容器啟動更快,資源開銷更小。 容器化技術可以輕量化因為它們提供了一種封裝應用程式及其依賴項的方式,這樣的封裝可以在不同的運行環境中保持一致。這裡是一些具體的原因: ![螢幕擷取畫面 2023-11-10 135858](https://hackmd.io/_uploads/rkvHvBsQ6.jpg) - 1.共享作業系統核心:容器與主機作業系統共享核心,不需要像傳統虛擬機那樣為每個應用程序實例運行一個完整的作業系統。 - 2.更少的資源需求:容器通常只包含應用程序運行所必需的最小運行環境和程式庫(libraries),大大減少了資源的消耗。 - 3.快速啟動:容器可以在幾秒內啟動和停止,這對於快速部署和自動擴展至關重要。 ![DALL·E 2023-11-10 14.05.57 - An illustration showing why containers can start quickly](https://hackmd.io/_uploads/HkIGhBi7T.jpg) - 4.效率和密度:因為容器共享資源,所以同一硬體上可以運行更多的容器實例,提高了資源利用率。 - 5. 微服務架構:容器化支援微服務架構,這意味著應用程序可以被拆分成小的、獨立的部分,每個部分都運行在自己的容器中,這樣做可以提高靈活性和可維護性。 總而言之,容器化技術通過共享作業系統資源、最小化運行時依賴以及支援微服務架構,實現了應用程序部署的輕量化和高效性。 ### 3. **可移植性** - 由於容器內包含了應用程序運行所需的一切,因此它可以輕鬆地在不同的操作系統、平台或雲環境間移動和部署。 ![c633d546-8c42-4be8-b668-5f51a5ef3b00](https://hackmd.io/_uploads/Hy84GLsmp.jpg) ### 4. **微服務架構** - 容器化支持微服務架構,使得應用程序能夠被拆分成更小、更容易管理和更新的部分。 ![image.png](https://hackmd.io/_uploads/B1zZP757T.png) ----- 1. API gateway: 這是工廠的中央指揮中心,它管理著所有的訊息流和請求。就像一個管理員,它指揮著哪些部分需要活動以及何時活動。 2. 裝配(Assembly): 這是工廠的第一站,代表一個專注於組裝產品部件的微服務。圖中以機器手臂來表示,顯示了這個服務是如何建立產品的。 3. 品質控制(Quality Control): 每個產品在出廠前都需要經過品管檢查。這個站點用放大鏡作為圖示,表示微服務會仔細檢查每個產品以確保品質。 4. 包裝(Packaging): 產品組裝完成後,需要進行包裝以便運送。這個微服務用一個包裝好的盒子來表示,它負責將產品打包。 5. 運輸(Shipping): 最後一個階段是將產品發送到客戶手中。圖中用一輛卡車來表示這個微服務,它確保產品安全、準時的運達客戶。 6. 訊息流: 圖中的箭頭顯示訊息在各個微服務之間的流動方式。每個微服務都是獨立的,它們通過 API gateway交換訊息,這就像是產品在製造流程中的每個階段都會經過的檢查和轉移。 這個圖提供了一個形象的比喻,幫助理解微服務架構中每個獨立服務的角色和它們如何協同工作來完成整個過程。每個微服務都像工廠的一個工作站,專注於一個特定的任務,但最終共同完成產品的製造和交付。 ### 5. **持續整合和持續部署(CI/CD)** - 容器化非常適合自動化的開發管道,如CI/CD,它允許開發者快速集成和部署應用程序的更新。 ![image.png](https://hackmd.io/_uploads/ryFZlr97T.png) - (Code):用鉛筆表示。這是開發人員編寫和修改程式碼的階段。 - (Build):用錘子表示。在這一階段,編寫的程式碼會被編譯或轉換成可以運作的軟體。 - (Test):用打勾表示。自動測試在此階段進行,以確保程式碼的修改不會代入錯誤。 - (Deploy):用火箭表示。這是將通過測試的程式碼部署到生產環境的階段。 - (Monitor):用眼睛表示。這一階段是對生產環境進行監控,以確保應用程式的性能和健康狀況。 圖中的箭頭顯示了工作流程的方向,從程式碼開始,經過建置、測試、部署,最後到監控。這個循環不斷迭代,意味著一旦在監控階段發現問題,就會回到程式碼階段進行改進,從而形成了一個閉鎖且連續的工作流程。這個流程強調了持續整合和持續部署的自動化和無縫連接性。 ![image.png](https://hackmd.io/_uploads/rkk3AJK76.png) ## Docker 是之前最流行的容器化平台之一,它提供了一個開源的容器化引擎,讓開發者能夠輕鬆地建立、部署和管理容器。Kubernetes 則是一個廣泛使用的容器編排系統,用於自動化容器的部署、擴展和管理。這些技術正在現代軟體開發和運維中扮演著越來越重要的角色。 ![image](https://hackmd.io/_uploads/BJ5HRSu46.png) ----------- ## 架構 4.12 version ![image](https://hackmd.io/_uploads/Sknt68gVa.png) ![image](https://hackmd.io/_uploads/rk6-eDl4p.png) -------- ![image](https://hackmd.io/_uploads/H1qTWwgVp.png) ## OCP cluster GUI ![image](https://hackmd.io/_uploads/rJ4KFIeVp.png) ### 延伸閱讀 - [虛擬化1](https://medium.com/mr-efacani-teatime/%E6%B7%BA%E8%AB%87%E8%99%9B%E6%93%AC%E5%8C%96%E6%8A%80%E8%A1%93-%E8%99%9B%E6%93%AC%E6%A9%9F-vm-%E8%88%87%E5%AE%B9%E5%99%A8-container-%E4%B9%8B%E6%8A%80%E8%A1%93%E5%83%B9%E5%80%BC%E8%88%87%E6%AF%94%E8%BC%83%E5%88%86%E6%9E%90-5c10457aad62) - [虛擬化2](https://chengweihu.com/docker-tutorial/)