Docker - 容器與主機



Docker 容器是輕量級、可移植、自包含的單元,包含軟體及其執行所需的一切:程式碼、執行時庫和設定。它們在不同的環境中始終如一地工作;因此,可以保證軟體在非生產環境和生產環境中都能以相同的方式工作。

另一方面,Docker 主機是安裝並執行 Docker Engine 的機器。這些可能是物理伺服器、虛擬機器,甚至基於雲的例項。

在本章中,讓我們詳細瞭解 Docker 容器與 Docker 主機之間的區別。

什麼是 Docker 容器?

Docker 容器是輕量級、可移植的軟體打包單元,不僅包含應用程式程式碼,還包含執行時和庫以及在任何地方執行和執行相同的其他設定。它們作為任何主機作業系統上的獨立程序執行。每個容器都必須共享作業系統核心,但與其他容器具有不同的環境。

這允許有效地利用資源。由於這種隔離,不同版本的軟體及其依賴項不會相互干擾;因此,容器非常適合開發、測試和部署。Docker 容器支援輕鬆整合和持續部署,這有助於快速可靠地交付應用程式。

什麼是 Docker 主機?

Docker 主機是安裝 Docker Engine 的物理機或虛擬機器;它建立了一個執行 Docker 容器的環境。它提供對 CPU、記憶體、儲存和網路的訪問,容器利用這些資源並作為獨立程序執行,以允許它們共享主機的相同作業系統核心。

它隔離容器並管理資源,從而有效且安全地支援多個容器的執行。Docker 主機幫助組織靈活且可控地在各種環境中管理、擴充套件和部署容器化應用程式。

Docker 容器和主機的區別

Docker 為在容器內開發、交付和執行應用程式提供了一個強大的平臺。儘管 Docker 容器和 Docker 主機是生態系統中的兩個重要元素,但它們的角色卻大不相同。

下表重點介紹了 Docker 容器和 Docker 主機之間的主要區別:

特徵 Docker 容器 Docker 主機
用途

輕量級、可移植且自包含的物件;它們包含一個應用程式及其所有依賴項。

這意味著軟體在不同的環境中始終如一地執行。

提供 Docker 容器基本環境的物理機或虛擬機器,透過執行 Docker Engine,提供 CPU、RAM 和儲存空間等基本資源。
操作 作為主機作業系統上的獨立程序執行。它們都將在相同的核心上執行,但具有獨立的環境。 執行多個容器,管理它們之間的資源分配和隔離。
資源管理 與主機共享底層作業系統核心並有效地使用其資源,而無需整個作業系統例項的所有開銷。 在許多容器之間共享可用的系統資源並有效地平衡它們。
隔離 在應用程式級別提供隔離,確保不同的應用程式及其依賴項不會相互干擾。 提供一個安全的容器執行環境,使用主機作業系統來保持隔離和控制。
部署 由於其“輕量級”特性,它們可以輕鬆地重新定位到不同的 Docker 主機,因此可在各種環境(從開發到生產)中移植和擴充套件。 這是部署容器的基礎層,它提供了容器操作和編排所需的必要基礎設施。

Docker 容器和主機如何相互互動?

Docker 容器和主機之間的互動是一個多維活動,Docker Engine 透過它來協調建立、管理和執行容器化應用程式。現在,讓我們深入瞭解此概念的細節。

映象管理

拉取映象 − 當用戶請求從本地不可用的映象執行容器時,Docker Engine 會與容器登錄檔(如 Docker Hub)通訊以下載該映象。映象充當容器的藍圖。

映象儲存 − 然後在主機的檔案系統上進行下載映象的結構化儲存,允許 Docker Engine 有效地獲取和進一步利用它們。

構建映象(可選) − 如果要建立自定義映象,則需要編寫一個 Dockerfile 來描述如何構建映象。此檔案將由 Docker Engine 處理,執行每個指令將逐層建立一個映象。

容器隔離和建立

名稱空間隔離 − Docker 引擎使用核心名稱空間為每個容器提供隔離的作業系統檢視。這意味著每個容器都有不同的程序 ID、網路介面、掛載點等;因此,一個容器不會干擾另一個容器或主機。

控制組 (cgroups) − cgroups 用於限制和管理容器可以使用多少資源,從而確保容器之間的資源公平性,並避免一個容器消耗所有資源的問題。

聯合掛載檔案系統 − Docker 本身使用聯合掛載檔案系統,從而提供了一種處理容器中層的有效解決方案。這允許多個容器共享公共映象層,同時保持其可寫層以實現資料永續性。

網路

橋接網路 − 預設情況下,Docker Engine 在主機上建立一個虛擬橋接網路 - 例如 docker0,並將容器新增到此橋接網路,以便它們相互通訊並在外部通訊。

埠對映 − 您還可以公開容器上的埠並將其對映到主機上的埠。這樣,該容器內的服務就可以從主機的網路或網際網路訪問。

自定義網路 − Docker 支援橋接、覆蓋網路和 macvlan 等網路驅動程式來建立具有特定隔離需求的自定義拓撲。

儲存

− 卷是獨立於容器的永續性儲存。它們允許在容器之間共享資料,並在容器停止或刪除後仍然存在。

繫結掛載 − 這是一種可以在主機和容器之間共享檔案和目錄的方式。它提供了很高的儲存靈活性,但會失去隔離性。

執行時管理

執行/停止容器 − Docker Engine 執行容器生命週期的所有各個階段,例如啟動、停止、重新啟動和暫停,具體取決於需要。您可以監視容器的資源使用情況(例如 CPU 和記憶體),檢視日誌以進行除錯,並以其他方式瞭解應用程式的行為。

安全 − Docker 引擎實施安全措施以隔離容器,從而限制它們對主機資源的訪問。還有許多標誌和選項可用於管理功能和容器的安全配置檔案。

與 Docker 容器和主機互動的命令

在這裡,我們將重點介紹一些可用於與 Docker 容器和主機互動的命令:

Docker Run

“docker run”命令從指定的映象啟動一個新容器。您可以使用多個選項自定義容器的行為:

  • -d (分離) − 在後臺執行容器。
  • -p (釋出) − 對映容器和主機之間的埠。
  • -v (卷) − 掛載用於資料永續性的卷。
  • --name − 為容器分配自定義名稱。

示例

$ docker run -d -p 80:80 nginx  
docker run

它啟動一個分離的 Nginx Web 伺服器容器,並公開埠 80。

docker ps

“docker ps”命令列出主機上所有正在執行的容器。您可以使用它來監視容器的狀態並獲取有價值的資訊,例如它們的名稱、ID 或公開的埠。

示例

$ docker ps -a  
docker ps

它列出所有容器(正在執行和已停止)。

docker exec

“docker exec”命令允許您在正在執行的容器內執行命令。這就像 SSH 到遠端機器一樣。

示例

$ docker exec -it my-container bash 
docker exec

它在名為“my-container”的容器內啟動一個互動式 Bash shell。

如何從主機訪問 Docker 容器內執行的服務?

公開 Docker 容器內服務的最常見方法是將容器的埠對映到主機埠。您可以在執行容器時使用 -p 或 --publish 選項。

例如,docker run -p 8080:80 my-web-server 會將容器內埠 80 上執行的 Web 伺服器暴露到本地埠 8080 上。此外,當您的主機執行 Docker Desktop 時,您可以使用特定的 DNS 名稱“host.docker.internal”從容器內部訪問主機上的服務。

結論

在本章中,我們討論了 Docker 容器和主機的來龍去脈。我們瞭解了它們的本質、它們之間如何互動、它們之間的根本區別,以及可用於與 Docker 容器和主機互動的各種命令。

廣告

© . All rights reserved.