
- Docker 教程
- Docker - 首頁
- Docker - 概述
- Docker - 在 Linux 上安裝
- Docker - 安裝
- Docker - Hub
- Docker - 映象
- Docker - 容器
- Docker - 倉庫
- Docker - Compose
- Docker - 使用容器
- Docker - 架構
- Docker - 層
- Docker - 容器和主機
- Docker - 配置
- Docker - 容器和 Shell
- Docker - Dockerfile
- Docker - 構建檔案
- Docker - 公共倉庫
- Docker - 管理埠
- Docker - Web 伺服器
- Docker - 命令
- Docker - 容器連結
- Docker - 資料儲存
- Docker - 卷
- Docker - 網路
- Docker - 安全
- Docker - 工具箱
- Docker - 雲
- Docker - 構建雲
- Docker - 日誌記錄
- Docker - 持續整合
- Docker - Kubernetes 架構
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 託管
- Docker - 最佳實踐
- Docker 設定服務
- Docker - 設定 Node.js
- Docker - 設定 MongoDB
- Docker - 設定 NGINX
- Docker - 設定 ASP.Net
- Docker - 設定 MySQL
- Docker - 設定 Go
- Docker - 設定 Rust
- Docker - 設定 Apache
- Docker - 設定 MariaDB
- Docker - 設定 Jupyter
- Docker - 設定 Portainer
- Docker - 設定 Rstudio
- Docker - 設定 Plex
- Docker 設定 - Flame
- Docker 設定 - PostgreSql
- Docker 設定 - Mosquitto
- Docker 設定 - Grafana
- Docker 設定 - Nextcloud
- Docker 設定 - Pawns
- Docker 設定 - Ubuntu
- Docker 設定 - RabbitMQ
- Docker - 設定 Python
- Docker - 設定 Java
- Docker - 設定 Redis
- Docker - 設定 Alpine
- Docker - 設定 BusyBox
- Docker 設定 - Traefik
- Docker 設定 - WordPress
- Docker 有用資源
- Docker - 快速指南
- Docker - 有用資源
- Docker - 討論
Docker - 架構
DevOps 和 SRE 團隊最困難的任務之一是弄清楚如何在許多雲和開發環境中管理所有應用程式依賴項和技術棧。為此,他們的流程通常包括在應用程式執行的任何位置保持應用程式正常工作,通常無需更改其大部分程式碼。
Docker 幫助所有工程師提高效率並降低運營開銷,使任何開發人員在任何開發環境中都能建立強大可靠的應用程式。Docker 是一個用於構建、交付和執行軟體程式的開放平臺。
Docker 允許您將應用程式與基礎設施分離,從而能夠快速釋出軟體。Docker 允許您以與管理應用程式相同的方式管理基礎設施。使用 Docker 的程式碼交付、測試和部署方法可以大大縮短從生成程式碼到在生產環境中執行程式碼之間的時間。
Docker 使用客戶端-伺服器架構。Docker 客戶端與 Docker 守護程序通訊,後者執行建立、執行和分發 Docker 容器的繁重工作。Docker 客戶端與守護程序在同一主機上執行,或者我們可以遠端連結 Docker 客戶端和守護程序。Docker 客戶端和守護程序透過 REST API 透過 UNIX 套接字或網路進行通訊。

在本章中,讓我們詳細討論 Docker 架構。
容器和虛擬機器的區別
虛擬機器 (VM) 旨在完成如果直接在主機環境中執行將存在風險的任務。VM 與系統其餘部分隔離,因此虛擬機器中的軟體無法干擾主機計算機。
虛擬機器是計算機檔案或軟體,通常稱為客戶機或在稱為主機的計算環境中生成的映象。

虛擬機器可以像在單獨的計算機上一樣執行應用程式和程式,這使其非常適合測試其他作業系統(例如測試版)、建立作業系統備份以及安裝軟體和應用程式。主機可以同時執行多個虛擬機器。
虛擬機器包含多個基本檔案,包括日誌檔案、NVRAM 設定檔案、虛擬磁碟檔案和配置檔案。
伺服器虛擬化是虛擬機器可以非常有用的另一個領域。伺服器虛擬化將物理伺服器劃分為多個隔離且唯一的伺服器,允許每個伺服器獨立執行其作業系統。每個虛擬機器都有其虛擬硬體,包括 CPU、RAM、網路埠、硬碟驅動器和其他元件。
另一方面,Docker 是一種軟體開發工具和虛擬化技術,允許您利用容器輕鬆建立、部署和管理程式。容器是軟體的輕量級、獨立的可執行捆綁包,其中包含執行應用程式所需的所有庫、配置檔案、依賴項和其他元件。
換句話說,程式無論在哪裡執行或在什麼計算機上執行,執行方式都相同,因為容器在其整個軟體開發生命週期中為應用程式提供了一個環境。
由於容器是分開的,因此它們提供了安全性,允許許多容器在同一主機上同時執行。此外,容器是輕量級的,因為它們不需要虛擬機器管理程式的額外負載。虛擬機器管理程式類似於 VMware 或 VirtualBox 的客戶機作業系統,但容器直接在主機機器核心中執行。
我應該選擇 Docker 還是虛擬機器 (VM)?
比較 Docker 和虛擬機器是不公平的,因為它們的目的不同。Docker 的確越來越受歡迎,但不能將其視為虛擬機器的替代品。儘管 Docker 很受歡迎,但在某些情況下,虛擬機器仍然是更好的選擇。
在生產環境中,虛擬機器優於 Docker 容器,因為它們執行自己的作業系統並且不會對主機計算機造成任何威脅。但是,出於測試目的,Docker 是最佳選擇,因為它為軟體或應用程式的完整測試提供了多個作業系統平臺。
此外,Docker 容器還使用 Docker 引擎而不是虛擬機器中的虛擬機器管理程式。由於沒有共享主機核心,因此使用 docker-engine 使容器變得緊湊、隔離、相容、高效能密集型且響應迅速。
Docker 容器的開銷很小,因為它們可以共享單個核心和應用程式庫。組織主要採用混合方法,因為虛擬機器和 Docker 容器之間的決策取決於交付的工作負載型別。
此外,只有少數數字業務組織依賴虛擬機器作為其主要選擇,而選擇使用容器,因為部署耗時,並且執行微服務是它面臨的最大障礙之一。但是,一些企業更喜歡虛擬機器而不是 Docker,主要是那些希望為其基礎設施提供企業級安全性的企業。
Docker 架構的元件
Docker 架構的關鍵元件包括:Docker Engine、Docker 倉庫和 Docker 物件(映象、容器、網路、儲存)
讓我們討論每個元件,以更好地瞭解 Docker 架構的不同元件如何相互互動。
Docker Engine
Docker Engine 是 Docker 平臺的基礎,它促進了容器生命週期的所有元素。它包含三個基本元件:命令列介面、REST API 和守護程序(處理作業)。
Docker 守護程序,通常稱為“dockerd”,會持續偵聽 Docker API 請求。它用於執行所有繁重的工作,例如建立和管理 Docker 物件(例如容器、卷、映象和網路)。Docker 守護程序可以與同一主機或不同主機上的其他守護程序通訊。例如,在 Swarm 叢集中,主機機器的守護程序可以連線到其他節點上的守護程序以完成任務。
Docker API 允許應用程式控制 Docker Engine。它們可以使用它來查詢有關容器或映象的詳細資訊、管理或上傳映象以及執行建立新容器等操作。此功能可以使用 HTTP 客戶端 Web 服務來實現。
Docker 倉庫
Docker 倉庫是儲存設施或服務,使您能夠根據需要儲存和檢索映象。例如,倉庫由 Docker 儲存庫組成,這些儲存庫將所有映象儲存在一個屋簷下。
公共倉庫有兩個主要元件:Docker Hub 和 Docker Cloud。私有倉庫在組織中也很流行。與這些儲存區域一起使用的最流行的命令是docker push、docker pull和docker run。
Dockerhub 是官方的 Docker 倉庫,包含多個官方映象儲存庫。儲存庫是類似 Docker 映象的集合,這些映象可以透過 Docker 標記唯一標識。Dockerhub 為其使用者提供了大量相關的官方和特定於供應商的映象。其中一些是 Nginx、Apache、Python、Java、Mongo、Node、MySQL、Ubuntu、Fedora、Centos 等。
您也可以在 Dockerhub 上設定自己的私有儲存庫,並使用 Docker push 命令來儲存您的自定義 Docker 映象。Docker 允許您在本地機器上構建自己的私有 Docker 倉庫。啟動包含倉庫映象的容器後,您可以使用 Docker push 命令將映象推送到此私有倉庫。
Docker 物件
使用 Docker 時,您將建立和管理映象、容器、網路、卷、外掛和其他專案。本節簡要總結了其中的一些內容。
Docker 映象
映象是一個只讀模板,包含構建 Docker 容器的指令。在許多情況下,映象是在另一個映象的基礎上構建的,並進行了一些小的修改。例如,您可以建立一個基於 Ubuntu 映象的映象,但其中包含 Apache Web 伺服器、您的應用程式以及執行應用程式所需的配置資訊。
您可以建立自己的映象,也可以使用其他人建立併發布到註冊中心的映象。要構建您的映象,請使用 Dockerfile,它使用簡單的語法來定義生成和執行映象所需的步驟。Dockerfile 中的每個指令都會在映象中生成一個層。當您編輯 Dockerfile 並重新構建映象時,只有修改過的層會被重建。這是映象與其他虛擬化方法相比更輕量級、更小巧、更快的部分原因之一。
您可以使用 Docker build 命令從 Dockerfile 建立 Docker 映象。
這裡,"-t" 用於為映象分配一個標籤。末尾的點指定了 Dockerfile 所在的構建上下文,在本例中為當前目錄。
$ docker build -t myimage .
Docker 容器
容器是映象的執行例項。可以使用 Docker API 或 CLI 建立、啟動、停止、移動或刪除容器。您可以將容器連結到一個或多個網路、附加儲存或甚至從其現有狀態構建新的映象。
容器通常與其他容器和主機有效隔離。您可以控制容器的網路、儲存和其他底層子系統與其他容器和主機隔離的程度。
容器由其映象以及建立或啟動時指定的任何配置引數定義。當容器被移除時,其狀態中任何非永續性的更改都會消失。
在生成映象時,容器可以完全訪問您在 Dockerfile 中定義的資源。此類設定包括構建上下文、網路連線、儲存、CPU、記憶體、埠等。例如,如果您希望訪問安裝了 Java 庫的容器,您可以使用 Dockerhub Java 映象和 Docker run 命令啟動一個連線到它的容器。
您可以使用 Docker run 命令建立容器。這裡,-it 標誌以互動模式啟動容器並將其與偽終端關聯。/bin/bash 指定容器啟動時要執行的命令。這將允許您訪問容器的 bash。
$ docker run -i -t ubuntu /bin/bash
Docker 網路
Docker 網路是所有隔離容器之間進行通訊的一種方式。Docker 中主要有四種網路驅動程式:
橋接網路 (Bridge)
這是容器的預設網路,無法與外部世界通訊。當您的應用程式執行在獨立容器上時,您會使用此網路,獨立容器是指在網路中連線的多個容器,這些容器僅允許它們彼此通訊,而不允許與外部世界通訊。
主機網路 (Host)
此驅動程式使 Docker 能夠與您本地機器上的資源無縫協作。它利用您機器的原生網路功能,在不同端點上的 Docker 應用程式之間啟用低階 IP 隧道和資料鏈路層加密。
覆蓋網路 (Overlay Network)
這是一種軟體定義的網路技術,允許容器相互連線。要將其連線到外部主機,首先在一個主機上構建一個虛擬橋接,然後構建一個覆蓋網路。您還需要設定覆蓋網路並允許從一側到另一側的訪問。通常,“none” 驅動程式表示網路已斷開連線。
Macvlan
macvlan 驅動程式可用於為容器分配地址並使其行為類似於物理裝置。它的特點是它使用容器的 MAC 地址而不是 IP 地址來引導容器之間的通訊。當您希望容器看起來像物理裝置時,例如遷移虛擬機器時,請使用此網路。
Docker 儲存
有多種方法可以安全地儲存資料。例如,您可以將資料儲存在容器的可寫層上,並使用儲存驅動程式。此方法的問題在於,如果您關閉或停止容器,則會丟失資料,除非您將其儲存到其他位置。
在 Docker 容器中進行持久化儲存時,有四種**方法**:
資料卷 (Data Volumes)
它們允許您建立永續性儲存、重新命名卷、列出卷以及檢視與卷關聯的容器。資料卷放置在容器的寫時複製機制之外的資料儲存上,例如 S3 或 Azure。
卷容器 (Volume Container)
卷容器是一種替代方案,其中一個專用容器承載一個卷,然後可以將其掛載或符號連結到其他容器。在這種方法中,卷容器獨立於應用程式容器,允許在多個容器之間共享。
目錄掛載 (Directory Mounts)
第三種選擇是在容器中掛載主機的本地目錄。在早期情況下,卷必須位於 Docker 卷資料夾中,而目錄掛載可以來自主機計算機上的任何目錄。
儲存外掛 (Storage Plugins)
儲存外掛允許 Docker 連線到外部儲存源。這些外掛使 Docker 能夠透過將主機的驅動器對映到外部源來與儲存陣列或裝置協作。一個示例是允許您使用 Docker 安裝的 GlusterFS 儲存並將其對映到易於訪問的位置的外掛。
結論
總之,Docker 改變了開發人員和 IT 運維人員在跨多個環境處理應用程式依賴項和部署流程的方式。
Docker 的客戶端-伺服器架構有效地將應用程式與其底層基礎設施解耦,簡化了軟體的開發、交付和執行過程。這種方法極大地減少了從程式碼開發到生產過渡所需的時間和精力,提高了軟體開發流程的敏捷性和可擴充套件性。
Docker 容器的輕量級特性與其隔離特性相結合,為應用程式執行建立了一個穩定且一致的環境,而不管主機系統如何。
最終,Docker 的全面架構(包括 Docker Engine、註冊中心、映象、容器、網路和儲存等元件)為企業提供了維護高效能、可靠和安全應用程式環境所需的工具。
雖然 Docker 和虛擬機器有不同的用途和特性,但 Docker 的容器化技術非常適合現代的雲原生應用程式和微服務架構。在 DevOps 操作中使用 Docker 的組織可以提高構建和部署軟體的效率、靈活性和速度。
常見問題解答
問 1. Docker 架構的關鍵元件是什麼?
Docker 架構由多個關鍵元件組成。Docker Engine 由 Docker 守護程序、REST API 和命令列介面 (CLI) 組成,它們共同管理容器的生命週期。Docker 映象是用於生成容器的只讀模板,其中包含程式及其依賴項。
容器是映象的執行例項,充當應用程式的隔離環境。Docker 註冊中心(如 Docker Hub)儲存和分發映象,使其易於訪問。
Docker 網路使容器能夠相互連線以及與其他系統連線,而卷等儲存解決方案可確保資料在容器生命週期之外保持永續性。
問 2. Docker 是否可用於開發和生產環境?
是的,Docker 旨在用於開發、測試和生產環境,確保在所有階段為應用程式提供一致的環境。Docker 使開發人員能夠建立隔離的容器,這些容器複製了生產環境,確保程式一致地執行。
在測試期間,容器可用於建立可重複的測試環境,從而加快測試速度並減少由環境差異引起的問題。Docker 的編排技術(如 Docker Swarm 和 Kubernetes)透過處理容器的部署、擴充套件和管理,提高了其生產就緒性。