Docker - 容器



Docker 容器是 Docker 映象的執行時例項。可以透過例項化映象來建立它們。Docker 容器正在徹底改變軟體開發、部署和管理。從本質上講,Docker 容器將應用程式及其所有依賴項捆綁到一個緊湊、輕量級的包中。它們可以透過在作業系統級別使用虛擬化,在各種計算環境中可靠地執行。

這種封裝是透過使用**Docker 映象**來實現的。映象本質上是包含執行特定應用程式所需的所有檔案、庫和配置的藍圖。由於容器將應用程式及其依賴項與底層系統隔離開來,因此它們在各種環境中提供一致性和可預測性。

Docker 容器充當具有其自己的檔案系統、網路介面和資源的獨立程序,但它們輕量且高效,因為它們與主機作業系統共享相同的核心。它們依賴於 Docker 生態系統的重要元件才能工作,包括構建、啟動和管理容器的 Docker Engine,以及充當 Docker 映象儲存庫的 Docker Registry。

在本章中,讓我們瞭解容器的工作原理以及您最常使用的重要的 Docker 容器命令。

Docker 容器的關鍵概念

以下是 Docker 容器背後的關鍵概念和原則。

容器化

從本質上講,容器基於容器化的概念,即將應用程式及其所有依賴項打包到一個單一軟體包中。此軟體包稱為容器映象,其中包含執行應用程式所需的所有必要的執行時環境、庫和其他元件。

隔離

Docker 容器使用作業系統級虛擬化來提供應用程式隔離。每個容器都作為獨立的程序執行,具有自己的檔案系統、網路介面和程序空間,獨立於主機系統。

透過保持彼此獨立,容器透過這種隔離避免相互干擾。

Docker Engine

Docker Engine 是 Docker 容器背後的核心;它構建、啟動和維護它們。Docker Engine 由兩個組成部分構成:在後臺執行的 Docker 守護程序和允許使用者透過命令與 Docker 守護程序通訊的 Docker 客戶端。

映象和容器生命週期

Docker 容器生命週期的第一步是建立容器映象。此映象是使用 Dockerfile 構建的,Dockerfile 描述了應用程式的依賴項和配置。

建立映象後,可以使用它來例項化容器,容器是正在執行的映象例項。可以單獨啟動、停止、暫停和重新啟動容器。

資源管理

Docker 容器由於其共享核心體系結構和輕量級設計,提供有效的資源管理。由於容器共享主機作業系統的作業系統核心,因此減少了開銷並加快了啟動時間。

Docker 還提供用於監控和控制資源使用的工具,以確保最佳效能和可擴充套件性。

可移植性

Docker 容器的主要優勢之一是其可移植性。容器映象是獨立的單元,可以輕鬆地部署和分發到各種環境中,從生產到測試和開發。

這種可移植性簡化了部署過程並降低了相容性問題的可能性,實現了“一次構建,隨處執行”。

Docker 容器生命週期

Docker 容器生命週期包含五個基本階段:建立、啟動、暫停、退出和死亡。生命週期由其階段表示,從建立和執行到終止和可能的恢復。

瞭解這些階段對於有效地管理 Docker 容器並在容器化環境中確保其正確執行至關重要。

Docker Containers 1

讓我們探索 Docker 容器生命週期的各個階段

建立狀態

“建立”狀態是第一個階段。當使用 docker create 命令或類似的 API 呼叫建立容器時,它將進入此階段。處於“建立”狀態的容器尚未執行,但它確實作為一個靜態實體存在,其所有配置設定都已定義。

此時,Docker 預留了容器所需的儲存卷和網路介面,但容器內的程序尚未啟動。

啟動狀態

“啟動”或“執行”狀態是生命週期的下一階段。當使用 docker start 命令或等效的 API 呼叫啟動容器時,它將進入此階段。

當容器處於“啟動”狀態時,其程序將啟動並開始執行其映象中指定的應用程式或服務。在此狀態下,容器積極地使用 CPU、記憶體和其他系統資源來執行其分配的任務。

暫停狀態

在容器的生命週期中,容器也可能進入“暫停”狀態。當使用 docker pause 命令暫停容器時,其程序將掛起,從而停止其執行。

暫停的容器保持其資源分配和配置設定,但處於非活動狀態。此狀態有助於透過暫時停止容器執行(而無需完全停止)來節省資源和進行除錯。

退出狀態

處於“退出”狀態的容器已完成執行並退出其主程序。容器在完成其預期任務或遇到導致其終止的錯誤時可以進入此狀態。

“退出”的容器保持停止狀態,保留其資源和配置設定,但停止執行任何程序。在此狀態下,容器可以使用 docker rm 命令完全刪除或使用 docker start 命令重新啟動。

死亡狀態

處於“死亡”狀態的容器已遇到不可恢復的錯誤或已意外終止。容器化應用程式中的嚴重錯誤、底層主機系統中的問題或手動干預都可能導致容器進入此狀態。

當容器處於“死亡”狀態時,它處於非活動狀態,並且 Docker 守護程序通常會釋放或回收其資源。需要使用**docker rm 命令**刪除處於此狀態的容器,因為它們無法重新啟動,從而釋放系統資源。

重要的 Docker 容器命令

既然您已經瞭解了 Docker 容器的基礎知識及其工作原理,那麼讓我們藉助示例瞭解最重要的 Docker 容器命令。

列出所有 Docker 容器

可以使用**docker ps 命令**列出 Docker 主機上的正在執行的容器。預設情況下,它僅顯示正在執行的容器,您可以使用 -a 或 --all 標誌顯示所有容器,包括已停止的容器。

$ docker ps
Docker Containers 2

此命令顯示所有當前正在執行的容器的 ID、名稱、狀態和其他相關詳細資訊。如果沒有任何容器正在使用,則返回空列表。

執行 Docker 容器

啟動和建立 Docker 容器的主要命令是“docker run”。當您執行此命令時,如果本地尚未提供映象,Docker 會從登錄檔中拉取映象。然後,它透過基於該映象生成一個來啟動一個新的容器例項。

透過此命令,您可以指定多個選項,包括卷掛載、環境變數、埠對映等,以根據您的需求自定義容器配置。

$ docker run -d -p 8080:80 nginx
Docker Containers 3

在這種情況下,docker run 的分離模式 (-d) 基於“nginx”映象建立一個新容器並在後臺執行它。此外,它將主機埠 8080 對映到容器埠 80 (-p 8080:80),從而允許訪問容器中託管的 NGINX Web 伺服器。

停止 Docker 容器

可以使用 docker stop 命令優雅地停止容器,該命令向容器的主程序傳送 SIGTERM 訊號。這使容器能夠在關閉之前完成任何清理操作,例如儲存狀態或斷開網路連線。

$ docker stop my_container
Docker Containers 4

此命令停止當前正在執行的“my_container”容器。Docker 會等待容器在可配置的持續時間內(預設情況下為 10 秒)優雅地結束其生命週期。如果它在此時間限制內未停止,Docker 將自動使用 SIGKILL 訊號終止容器。

暫停正在執行的容器

可以使用 docker pause 命令暫時掛起正在執行的容器的程序或暫停其執行。這對於暫時釋放系統資源、除錯和解決問題可能很有用。

$ docker pause my_container
Docker Containers 5

此命令停止容器“my_container”的執行。當暫停時,容器不使用任何 CPU 或記憶體,因為其程序已凍結。但是,容器保留其資源分配和配置設定。

恢復 Docker 容器

當容器暫停時,可以使用 docker unpause 命令重新執行其程序。透過使用此命令,容器將返回到其初始狀態並撤消 docker pause 命令的效果。

$ docker unpause my_container
Docker Containers 6

上述命令恢復暫停的容器“my_container”的執行,並允許其程序照常繼續。

重啟容器

一種快速停止和重啟正在執行的容器的簡單方法是使用 docker restart 命令。它常用於在容器遇到問題後強制其重新初始化,或將更改應用於正在執行的容器的配置。

$ docker restart my_container 
Docker Containers 7

此命令會暫停然後恢復名為“my_container”的容器的執行。容器內的程序會在重啟時停止然後重新啟動,使任何修改生效。

在正在執行的 Docker 容器中執行命令

要在已執行的容器內執行命令,請使用 docker exec 命令。它允許使用者在容器的環境中執行任意命令,例如啟動 shell 會話或執行特定程式。

$ docker exec -it my_container bash 
Docker Containers 8

此命令在互動式 shell 會話(bash)中開啟當前正在執行的“my_container”容器。為了啟用互動式輸入/輸出,-it 標記分配一個偽終端並保持 STDIN 開啟,即使它未連線也是如此。

刪除 Docker 容器

要刪除一個或多個 Docker 容器,可以使用 docker rm 命令。可以指定要刪除的容器的 ID 或名稱。預設情況下,此命令僅刪除已停止的容器;要強制刪除正在執行的容器,可以使用 -f 或 --force 標記。

$ docker rm my_container 
Docker Containers 9

以上命令刪除名為“my_container”的容器。除非使用 -f 標記強制刪除,否則容器必須停止執行才能被刪除。

要清理 Docker 主機上的磁碟空間,可以使用 docker container prune 命令刪除所有已停止的容器。這是一種清理空閒容器並回收資源的實用方法。

$ docker container prune
Docker Containers 10

Docker 會在繼續之前請求確認,但您可以透過使用 -f 或 –force 標記傳遞它來忽略此提示。

如果要一起刪除所有 Docker 容器,可以使用兩個命令的組合 - “docker ps -aq”,它用於獲取所有容器 ID 的列表,並將其與“docker rm”命令結合使用以刪除所有容器,包括正在執行的容器。

$ docker rm $(docker ps -aq) 
Docker Containers 11

以上命令刪除 Docker 主機上的每個容器,無論它是否正在執行或已停止。

結論

總而言之,Docker 容器徹底改變了現代軟體開發構建、部署和管理應用程式的方式。Docker 容器是輕量級且可移植的環境,提供了許多優勢,例如一致性、可重複性、資源效率、可擴充套件性和可移植性,用於打包和執行應用程式。

開發人員可以使用各種 Docker 命令和工具輕鬆建立、部署和管理容器,從而促進更有效的開發工作流程並增強團隊協作。隨著容器化的普及,Docker 容器將繼續成為軟體開發生態系統的重要組成部分,幫助企業更快地創新並更有效地為客戶提供價值。

常見問題

Q1. Docker 是容器還是虛擬機器?

Docker 是一個容器化平臺,這意味著它使用容器來執行和打包應用程式。與虛擬機器 (VM) 虛擬化硬體不同,Docker 容器共享宿主機核心並虛擬化作業系統。

因此,由於它們不需要為每個應用程式提供單獨的作業系統例項,因此 Docker 容器比虛擬機器 (VM) 更輕量級且更高效。

Q2. Docker 和 Kubernetes 之間有什麼區別?

雖然它們有不同的用途,但 Docker 和 Kubernetes 都是容器生態系統中廣泛使用的工具。Docker 提供用於構建容器映象和在本地或生產環境中執行容器的工具。它主要用於建立、管理和執行容器。

Kubernetes 是一個容器編排平臺,可以自動化容器化應用程式的部署、擴充套件和管理。Docker 專注於容器化過程本身,而 Kubernetes 管理容器叢集並確保它們具有彈性、可擴充套件性和可用性。

Q3. 如何執行 Docker 容器?

您可以使用“docker run <image>”命令啟動 Docker 容器。您必須提及 Docker 映象的 ID 或名稱,該映象可在本地或透過 Docker Hub 等登錄檔獲取。然後,使用 docker run 命令後跟映象的名稱或 ID 來建立並從該映象啟動容器。為了進一步自定義容器的配置,您可以選擇提供更多引數,例如埠對映、環境變數和卷掛載。

Q4. 什麼是 Docker Daemon?

在主機系統上監控 Docker 容器的後臺程序稱為 Docker 守護程序或“dockerd”。除了執行容器生命週期任務(包括構建、啟動、停止和刪除容器)外,它還負責管理容器映象、網路和卷。為了管理容器資源,Docker 守護程序與主機作業系統的核心互動,同時偵聽來自 Docker 客戶端的 Docker API 請求並在使用者的代表下執行這些請求。

Q5. Docker 容器的生命週期是怎樣的?

Docker 容器的生命週期可能因其配置、建立方式以及它是在附加模式還是分離模式下執行而異。Docker 容器通常會無限期執行,除非其主程序結束或使用者手動停止或終止它。

當容器處於分離模式 (-d) 時,它們會在後臺執行,直到使用 docker stop 命令顯式停止它們,或直到 Docker 守護程序重新啟動。重啟策略是另一種設定容器的方式,以便在發生故障或停止時自行重啟。

廣告