- 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 - 容器與主機
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
它啟動一個分離的 Nginx Web 伺服器容器,並公開埠 80。
docker ps
“docker ps”命令列出主機上所有正在執行的容器。您可以使用它來監視容器的狀態並獲取有價值的資訊,例如它們的名稱、ID 或公開的埠。
示例
$ docker ps -a
它列出所有容器(正在執行和已停止)。
docker exec
“docker exec”命令允許您在正在執行的容器內執行命令。這就像 SSH 到遠端機器一樣。
示例
$ docker exec -it my-container bash
它在名為“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 容器和主機互動的各種命令。