相信大家無論是在Web抑或是DevOps領域或多或少都聽過Docker,那本系列主旨在於從Docker到K8s,手把手地將筆者的經驗分享給讀者,希望能燃起各位心中的Docker魂,將每位程序員心目中的Docker獸進化成Kubernetes獸。
這系列我們依據
分為各種不同的進化形態以及路線,紅線方向即是本系列的進化路線,所以本篇章一共會分為三大部分: Docker, Docker-compose 以及Kubernetes。
介紹Container & Docker的基礎與原理、Docker的安裝流程與使用時機,到如何撰寫Dockerfile與push Docker image到Docker hub上,完成階段練習能夠知道Docker原理與作業流程,學會如何將自己的程式容器化,並push到自己的hub上提供其他人下載。
Compose是種定義與運行多個容器的一種工具,透過yaml檔來配置所有服務與其所使用到的資源與關係,像是containers、docker network與volumes...等。藉由compose來定義所需服務的連結與設定,完成此階段練習能夠讓你學會如何撰寫docker-compose的yaml檔,並更深層了解container的進階服務與操作。
K8s是一種協助我們管理容器的服務,他能夠替我們自動地部署與管理多台機器上的容器,並且當服務的指定資源到達設定的臨界點時,將服務水平抑或是垂直的擴增。由K8s官方document上可以看到,他最能達到的目的有
Automated container deployment, scaling, and management
聽起來k8s百利並無一害,但想使用k8s必須對其有一定的掌握度,並學會撰寫其各不同服務與資源的yaml檔,完成此階段練習能夠知道k8s運行的原理,並且能夠學會一些基礎k8s元件的yaml撰寫,並且學會如何利用helm進行k8s服務的部署,雖然在短短的十幾個篇幅中無法完全掌K8s,但已足以讓你入門K8s。
那事不宜遲,我們就不浪費時間並進入正題!
Container是打包代碼及其所有依賴項的軟件的標准單元,因此該應用程序可以從一個計算環境快速可靠地運行到另一個計算環境。Container Image是一個輕量級的,獨立的,可執行的軟件包,其中包含運行應用程序所需的一切:代碼,運行時,系統工具,系統庫和設置。
Container image在運行時會成為Container,對於Docker Container,Image會在Docker Engine上運行時成為容器。不論基礎架構如何,容器化軟件都可用於基於Linux和Windows的應用程序,始終運行相同。容器將軟件與其環境隔離開來,並確保儘管開發和登台之間存在差異,但軟件仍可以均勻運行。
相信已經許多人聽過Container,並且也聽過Virtual machine,甚至是使用過它們。 那為何我會把他們一同拿出來比較呢?
因為他們的功能性相似,同樣都能用來獨立作業,讓主環境與部署的程式分離。並且同樣也能夠打包環境,並且方便在不同硬體上移動。但兩者從根本上有著很大的區別,也就是因為這些區別,驅使越來越多的人開始使用docker容器化技術。
Virtual machine會有自己的kernal與完整的作業系統。
而Container則是以主機的Kernal為基礎,在容器內只會包含應用程式與使用者模式的輕量化作業系統與服務。
以Microsft Azure為例
功能 | 虛擬機器 | 容器 |
---|---|---|
隔離 | 可與主機作業系統和其他 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 Service) 部署多個容器。 |
作業系統更新和升級 | 在每個 VM 上下載並安裝作業系統更新。 若要安裝新版作業系統,則必須升級,但通常會直接建立全新的 VM。 這可能非常耗時,特別是如果您有很多 VM 的話... | 在容器內更新或升級作業系統檔案的方法相同:編輯容器映像的組建檔案 (稱為 Dockerfile),以指向最新版的 Windows 基底映像。使用這個新的基底映像重建容器映像。將容器映像推送至容器登錄。使用協調器重新部署。協調器提供了強大的自動化功能而可大規模執行此作業。 如需詳細資訊,請參閱教學課程:在 Azure Kubernetes Service 中更新應用程式。 |
永續性儲存體 | 使用虛擬硬碟 (VHD) 作為單一 VM 的本機儲存體,或使用 SMB 檔案共用作為多部伺服器共用的儲存體 | 使用 Azure 磁碟作為單一節點的本機儲存體,或使用 Azure 檔案儲存體 (SMB 共用) 作為多個節點或伺服器共用的儲存體。 |
負載平衡 | 虛擬機器負載平衡功能會將執行中的 VM 移至容錯移轉叢集中的其他伺服器。 | 容器本身不會移動;相反地,協調器可以在叢集節點上自動啟動或停止容器,以管理負載和可用性的變更。 |
容錯 | VM 可以容錯移轉至叢集中的其他伺服器,並在新的伺服器上重新啟動 VM 的作業系統。 | 如果叢集節點失敗,則協調器就會在其他叢集節點上快速重新建立任何在失敗節點上執行的容器。 |
網路功能 | 使用虛擬網路介面卡。 | 使用虛擬網路介面卡的隔離觀點,因此所提供的虛擬化功能較少 (主機的防火牆會與容器共用),但同時也使用較少資源。 如需詳細資訊,請參閱 Windows 容器的網路功能。 |
也因此我認為容器化技術有著以下幾個優勢:
除此之外docker還有著相當多的好處,其他部分就要讀者在學習期間細細品嚐體會。
基於這些基礎往後也發展出了docker-compose、docker-swarm、kubernetes....等技術。也因這些優點我開始學習了Docker,在工作上成為了容器化技術的受惠者,因此我想分享我工作學習容器化技術的流程給大家,希望能帶給大家一些幫助。
讀完本篇後,各位對於Container有了初步的認識,也因此讓自己的Docker蛋提升了些經驗值!
https://www.docker.com/resources/what-container
https://docs.microsoft.com/zh-tw/virtualization/windowscontainers/about/containers-vs-vm