天天看點

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

作者:玄明Hanko

#頭條創作挑戰賽#

一、引言

随着雲計算和大資料的發展,軟體系統越來越複雜和龐大,傳統的單體架構已經難以滿足業務需求和技術挑戰。這也促使了軟體系統架構從單體架構到SOA架構再到微服務架構的變革與演變。在現階段越來越多的企業和開發者為了提高系統的靈活性、可擴充性、可靠性和使用者體驗,已經大量采用微服務架構,将一個大型的應用程式拆分為多個小的、自治的服務,每個服務可以獨立地部署、更新和擴充。

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

但是,微服務架構也帶來了一些新的問題和挑戰,如何快速地開發、測試、部署和運維多個服務?如何保證服務之間的協調和通信?如何保證服務的性能和安全性?如何管理服務之間的依賴關系?如何監控和調試服務?

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

為了解決這些問題和挑戰,我們需要一種工具或平台,可以讓我們更友善地建立、運作和管理多個服務。這就是 Docker 與K8S的作用。Docker 是一個開源的應用容器引擎,可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實作虛拟化。Docker 可以提高開發效率和可預測性,簡化部署和運維,提升系統的性能和安全性。

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

本文将介紹如何在微服務架構下使用 Docker 來實作工程化地開發、測試、部署和運維多個服務。

二、Docker概念和原理

Docker是一個開源的引擎,可以輕松的為任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生産環境中部署,包括VMs(虛拟機)、 bare metal、OpenStack 叢集和其他的基礎應用平台。

1、Docker核心概念

  • 鏡像(Image):鏡像是一個隻讀的模闆,包含了一個應用程式及其依賴環境所需的所有檔案。鏡像可以通過 Dockerfile 來建構,也可以從 Docker Hub 或其他倉庫中下載下傳。鏡像可以被複用和共享,也可以被分層和緩存,以提高效率和節省空間。
  • 容器(Container):容器是一個運作時的執行個體,是鏡像的一個可讀寫的副本。容器可以通過鏡像來建立,也可以通過指令或檔案來配置。容器可以被啟動、停止、删除、暫停、恢複等操作。容器之間可以通過網絡或資料卷來通信和共享資料。
  • 倉庫(Repository):倉庫是一個存儲和分發鏡像的地方,可以是公開的或私有的。倉庫可以由多個标簽(Tag)組成,标簽是鏡像的一個版本或别名。倉庫可以從 Docker Hub 或其他注冊中心(Registry)中拉取或推送鏡像。
  • 網絡(Network):網絡是一種連接配接容器之間或容器與外部網絡的方式。Docker 支援多種網絡模式,如橋接(Bridge)、主機(Host)、無(None)、覆寫(Overlay)等。Docker 還支援自定義網絡和網絡插件,以滿足不同的需求和場景。
  • 資料卷(Volume):資料卷是一種在容器之間或容器與主控端之間共享資料的方式。資料卷可以在容器建立時或運作時挂載到容器中,也可以被其他容器引用或複制。資料卷可以保證資料的持久性和一緻性,也可以提高資料的通路速度。
  • 服務(Service):服務是一種在多個容器之間抽象出一個邏輯單元的方式。服務可以定義容器的數量、規模、更新政策、負載均衡等屬性。服務可以通過 Docker Compose 或 Docker Swarm 等工具來編排和管理。

2、Docker應用場景

  • web應用的自動化打包和釋出;
  • 自動化測試和持續內建、釋出;
  • 在服務型環境中部署和調整資料庫或其他的背景應用;
  • 從頭編譯或者擴充現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。

3、Docker主要優勢

  • 輕量級:Docker 容器不需要運作一個完整的作業系統,隻需要共享主控端的核心,是以可以節省資源和提高性能。
  • 可移植性:Docker 容器可以在任何支援 Docker 的 Linux 機器上運作,無論是實體機、虛拟機、雲服務還是其他平台,都可以保證一緻的運作環境。
  • 隔離性:Docker 容器之間是互相隔離的,每個容器都有自己的檔案系統、網絡、程序空間等,不會互相幹擾和影響。
  • 可擴充性:Docker 容器可以根據業務需求和負載情況,快速地建立、銷毀、啟動、停止、遷移和擴充。
  • 可管理性:Docker 容器可以通過一些工具和平台,實作對容器的統一管理、監控、日志、安全等功能。

三、Docker安裝和配置

Docker有很多種安裝的選擇,我們推薦您在Ubuntu下面安裝,因為docker是在Ubuntu下面開發的,安裝包測試比較充分,可以保證軟體包的可用性。Mac, windows和其他的一些linux發行版本無法原生運作Docker,可以使用虛拟軟體建立一個ubuntu的虛拟機并在裡面運作docker。

以下是 Docker中文社群站安裝手冊:

https://www.docker.org.cn/book/install/install-docker-under-ubuntu-precise-20.html

四、Docker基本操作

以下是Docker的基本操作:

  1. 檢視Docker版本:
docker --version           
  1. 拉取鏡像:
docker pull image_name[:tag]           
  1. 列出本地鏡像:
docker images           
  1. 運作容器:
docker run [options] image_name[:tag] [command]           
  1. 顯示容器清單:
#正在運作的容器
docker ps
#列出所有容器(包括已停止的)
docker ps -a           
  1. 停止容器:
docker stop container_id/container_name           
  1. 啟動已停止的容器:
docker start container_id/container_name           
  1. 删除容器:
docker rm container_id/container_name           
  1. 檢視容器日志:
docker logs container_id/container_name           
  1. 進入容器内部終端:
docker exec -it container_id/container_name bash           

五、Docker網絡管理

Docker的網絡管理是非常重要的,它允許容器之間進行通信,并與外部網絡互動。Docker提供了幾種網絡模式,可以根據需求選擇不同的網絡配置。以下是Docker的網絡管理相關内容:

  1. 橋接網絡(Bridge Network): 預設情況下,Docker容器使用橋接網絡模式。在橋接網絡中,Docker守護程序會建立一個名為"docker0"的虛拟網橋,每個容器都會連接配接到這個網橋,并配置設定一個IP位址。容器之間可以直接通過IP位址進行通信。如果沒有指定網絡,Docker會自動将容器連接配接到預設的橋接網絡。
  2. 主機網絡(Host Network): 在主機網絡模式下,容器與主控端共享網絡棧,即容器與主控端使用同一個網絡接口和IP位址。這樣容器的網絡性能更高,但缺乏隔離性,容器的端口與主控端的端口是一緻的,是以可能出現端口沖突的問題。
  3. 容器網絡(Container Network): 容器網絡允許多個容器共享同一個網絡棧,這樣這些容器之間可以直接通過localhost進行通信。這種網絡模式适用于需要共享網絡命名空間的應用場景。

六、Docker資料管理

Docker的資料管理是非常重要的,它涉及到容器内部資料的持久化、備份和恢複等操作。Docker提供了幾種方式來管理容器内的資料,以便確定資料的安全性和持久性。以下是Docker的資料管理相關内容:

  1. 資料卷(Volume): 資料卷是Docker中最常用的資料管理方式之一,它允許将主控端上的目錄或檔案映射到容器中的指定路徑。這樣,容器内的資料就可以持久化儲存在主控端上,即使容器被删除或重新開機,資料也不會丢失。建立一個資料卷并将其挂載到容器中:
docker volume create my_data_volume
docker run -d --name my_container -v my_data_volume:/path/to/container/data image_name           
  1. 綁定挂載(Bind Mount): 綁定挂載是将主控端上的目錄或檔案直接挂載到容器中的指定路徑,與資料卷不同,綁定挂載沒有額外的管理功能,但是更為靈活,可以直接使用主控端上的檔案。運作一個容器并使用綁定挂載:

七、Docker服務編排

Docker 的服務編排是指通過一系列定義好的配置來管理多個 Docker 容器的部署和運作,以實作應用程式的高可用性、彈性伸縮和負載均衡等功能。Docker 提供了多種工具和機制來進行服務編排,其中最常用的有 Docker Compose 和 Docker Swarm。

  1. Docker Compose: Docker Compose 是 Docker 官方提供的用于定義和管理多個容器的工具。通過編寫一個 YAML 檔案,您可以定義多個服務、網絡、卷等資訊,以描述整個應用的結構和配置。Docker Compose 可以幫助您快速建立和管理複雜的多容器應用,并通過一條指令來啟動、停止、檢視容器的日志等操作。
  2. Docker Swarm: Docker Swarm 是 Docker 内置的原生容器編排和叢集管理工具。它允許将多個 Docker 主機組成一個 Swarm 叢集,使容器可以跨多個主機進行部署和運作。Docker Swarm 提供了高可用性、負載均衡和容器彈性伸縮等功能,可以将多個容器組織成一個統一的服務,并根據需要進行自動擴充或縮減。

八、容器的現狀與對比

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

目前,容器技術在雲計算和應用開發領域中廣泛應用,并且有幾種主要的容器技術,如Docker、Podman、Containerd等。

以下是幾個項目Github資料對比

微服務架構的完美伴侶:深度解析工程化 Docker 實踐

Docker 項目的源代碼倉庫之是以是 https://github.com/moby/moby,是因為在過去 Docker 公司的産品名稱就是 Docker,是以項目的源代碼倉庫也叫作 Docker。然而,後來 Docker 公司将其核心技術移交給了開源社群,這個過程中,由于 Docker 這個名稱被注冊為商标,是以不能再作為開源項目的名稱。

為了避免商标沖突,Docker 項目在2017年将其源代碼倉庫遷移到了 GitHub,并将倉庫名稱改為了 "moby"。這個名稱是受到了 Herman Melville 的小說 "Moby-Dick" 的啟發,其中的白鲸 "Moby Dick" 以其龐大和複雜而聞名。這個名稱也象征着 Docker 項目的開放性、複雜性和多樣性。

1、Docker

微服務架構的完美伴侶:深度解析工程化 Docker 實踐
  • 現狀:Docker 是最早并且最為流行的容器技術,擁有龐大的使用者和社群支援。它提供了簡單易用的指令行工具和圖形界面,使得容器的建立、管理和部署變得非常簡單。
  • 優點:Docker 提供了完善的生态系統,擁有大量的鏡像倉庫(如 Docker Hub)供使用者分享和下載下傳公共鏡像。它具有跨平台性,支援在多種作業系統上運作容器。
  • 缺點:Docker Daemon 的設計相對龐大,有時會占用較多的系統資源。此外,Docker 使用 root 權限來運作容器,可能導緻安全性問題。

2、Podman

微服務架構的完美伴侶:深度解析工程化 Docker 實踐
  • 現狀:Podman 是一種與 Docker 類似的容器技術,不需要背景守護程序(Docker Daemon),是以更輕量級,并可以避免一些 Docker 的安全問題。它相容 Docker CLI,可以直接替代 Docker 使用。
  • 優點:Podman 提供了和 Docker 一樣的使用者體驗,但在安全性和資源消耗方面更優。它可以運作在不同的容器運作時(如 containerd 或 runc)上,具有更大的靈活性。
  • 缺點:Podman 的生态系統相對 Docker 還不夠豐富,雖然可以使用 Docker Hub 的鏡像,但在一些特定的場景下可能會遇到相容性問題。

3、Containerd

微服務架構的完美伴侶:深度解析工程化 Docker 實踐
  • 現狀:Containerd 是一個面向生産環境的容器運作時,是 Docker 的核心元件之一。它提供了容器的基本功能,但通常需要和其他工具(如 Docker 或 Kubernetes)結合使用。
  • 優點:Containerd 的設計注重穩定性和性能,适用于大規模生産環境。它支援 OCI(Open Container Initiative)标準,與多個容器管理工具相容。
  • 缺點:Containerd 隻提供了最基本的容器運作時功能,缺乏直接操作容器的使用者接口。通常需要和其他工具配合使用,不适合直接用于開發者的日常使用。

Docker 是最為流行和成熟的容器技術,擁有豐富的生态系統和使用者基礎。Podman 提供了更輕量級和安全的替代方案,尤其在需要避免 Docker 安全問題或在不需要 Docker Daemon 的場景下較為合适。Containerd 則是一個面向生産環境的容器運作時,更适合在底層與其他工具內建使用。選擇合适的容器技術取決于具體的使用場景和需求。

如果文章對你有幫助,歡迎關注+點贊!!!