Docker 容器的運作方式

已完成

先前,您探討了容器成為用來散發應用程式的單位。 您也了解容器採用開發人員和營運小組所使用的標準化格式。

在您的範例中,您正在開發一個訂單追蹤入口網站,以供您的公司的各個銷售點使用。 建置 Docker 映像之後,營運小組現在負責部署、推出更新,以及管理訂單追蹤入口網站。

在上一個單元中,您探討了 Docker 映像的建置方式。 您將在此處探討 Docker 容器的生命週期,以及如何管理容器。 您也將了解如何考慮為您的容器設定資料儲存空間和網路選項。

如何管理 Docker 容器

Docker 容器具有生命週期,您能夠用以管理及追蹤該容器的狀態。

顯示容器生命週期,以及生命週期階段之間轉換的圖表。

若要讓容器處於執行狀態,請使用 run 命令。 您也可以重新啟動已在執行中的容器。 重新啟動容器時,該容器會收到終止信號,讓任何執行中的處理序均能正常關閉,然後容器的核心才會終止。

將容器暫停、停止或終止之前,均會將其視為處於執行中狀態。 不過,容器也可以自行從執行中的狀態結束。 當執行中的處理序完成或處理序進入錯誤狀態時,容器可自行結束。

若要暫停執行中的容器,請使用 pause 命令。 此命令會暫停容器中的所有處理序。

若要停止執行中的容器,請使用 stop 命令。 stop 命令會透過將終止信號傳送給運作中的處理序,好讓該處理序能夠正常關閉。 容器的核心會在處理序關閉後終止。

如果您需要終止容器,請使用 kill 命令來傳送終止信號。 容器的核心會擷取終止信號,但執行處理序不會。 此命令會強制終止容器內運作中的處理序。

最後,若要移除處於停止狀態的容器,請使用 remove 命令。 移除容器之後,儲存在容器中的所有資料就會終結。

如何檢視可用的容器

若要列出執行中的容器,請執行 docker ps 命令。 若要查看處於所有狀態的所有容器,請傳遞 -a 引數。

以下是範例:

docker ps -a

以下是該命令的輸出:

CONTAINER ID    IMAGE        COMMAND         CREATED       STATUS           PORTS        NAMES
d93d40cc1ce9    tmp-ubuntu:latest  "dotnet website.dll …"  6 seconds ago    Up 5 seconds        8080/tcp      happy_wilbur
33a6cf71f7c1    tmp-ubuntu:latest  "dotnet website.dll …"  2 hours ago     Exited (0) 9 seconds ago            adoring_borg

前面的輸出中有三個要檢閱的項目:

  • IMAGE 資料行中列出的映像名稱;在此範例中,tmp-ubuntu: 最新。 請注意,您可以從相同映像中建立一個以上的容器。 這是一個強大的管理功能,您可以在解決方案中用來調整規模。

  • STATUS 資料行中所列的容器狀態。 在此範例中,您有一個執行中的容器和一個已結束的容器。 容器的狀態通常是您容器健康狀態的第一個指示器。

  • NAMES 資料行中所列的容器名稱。 除了第一個資料行中的容器識別碼,容器也會收到名稱。 在此範例中,您並未明確提供每個容器的名稱,因此,Docker 會為容器指定隨機名稱。 若要利用 --name 旗標為容器提供明確名稱,請使用 run 命令。

為什麼要為容器指定名稱?

此功能可讓您執行相同映像的多個容器執行個體。 容器名稱是唯一的,這表示如果您指定名稱,您便無法重複使用該名稱來建立新容器。 重複使用特定名稱的唯一方式就是移除先前的容器。

如何執行容器

若要啟動容器,請使用 docker run 命令。 您只需指定要以其名稱或識別碼執行映像,即可從該映像中啟動容器。 以這種方式啟動的容器可提供互動式體驗。

在此,若要在背景中搭配網站執行容器,請新增 -d 旗標。

docker run -d tmp-ubuntu

在此情況下,命令只會傳回新容器的識別碼。

在您指定要執行的映像之後,Docker 就會尋找該映像、從映像中載入容器,然後執行指定的命令作為進入點。 此時,就能使用容器進行管理。

如何暫停容器

若要暫停容器,請執行 docker pause 命令。 以下是範例:

docker pause happy_wilbur

暫停容器會暫停所有處理序。 此命令可讓容器在後續階段中繼續執行處理序。 docker unpause 命令會取消暫停指定容器中的所有處理序。

如何將容器重新開機

若要重新啟動容器,請執行 docker restart 命令。 以下是範例:

docker restart happy_wilbur

容器會收到 stop 命令,後面接著 start 命令。 如果容器沒有回應 stop 命令,則會傳送終止信號。

如何停止容器

若要停止執行中的容器,請執行 docker stop 命令。 以下是範例:

docker stop happy_wilbur

Stop 命令會將終止信號傳送到容器及在容器中執行的處理序。

如何移除容器

若要移除容器,請執行 docker rm 命令。 以下是範例:

docker rm happy_wilbur

移除容器之後,容器中的所有資料就會終結。 考慮儲存資料時,必須一律將容器視為暫時性。

Docker 容器儲存體設定

如我們先前所述,當容器中的應用程式需要儲存資料時,請一律將容器視為暫時性。

假設您的追蹤入口網站會在應用程式根目錄的子資料夾中建立記錄檔,也就是直接到容器檔案系統。 當應用程式將資料寫入到記錄檔時,系統會將資料寫入到可寫入的容器層。

雖然這個方法可行,但不幸的是,有數個缺點。

  • 容器儲存體是暫時性的。

    您的記錄檔將不會保存在容器執行個體之間。 例如,假設您停止並移除容器。 當您啟動新的容器執行個體時,新的執行個體會以所指定的映像作為基礎,且所有先前的資料都將遺失。 請記住,當您移除容器時,容器中的所有資料都會隨著該容器而終結。

  • 容器儲存體會與底層主機電腦結合。

    難以從容器存取或移動記錄檔,因為容器會與底層主機電腦結合。 您必須連線到容器執行個體,才能存取該檔案。

  • 容器儲存磁碟機的效能較低。

    容器會實作儲存體驅動程式,以允許應用程式寫入資料。 此驅動程式引進額外的抽象概念來與主機作業系統核心通訊,而且比直接寫入到主機檔案系統的效能更低。

容器可以利用兩個選項來保存資料。 第一個選項是使用「磁碟區」,第二個選項則是「繫結裝載」

什麼是磁碟區?

磁碟區會儲存於主機檔案系統的特定資料夾位置。 請選擇您知道非 Docker 處理序不會修改其中資料的資料夾。

Docker 會執行 docker volume create 命令來建立和管理新的磁碟區。 此命令可以形成 Dockerfile 定義的一部分,這表示您可以在容器建立過程中建立磁碟區。 當您第一次嘗試將磁碟區裝載到容器時,Docker 會建立磁碟區 (如果其不存在的話)。

磁碟區會儲存於主機檔案系統上的目錄內。 Docker 會裝載和管理容器中的磁碟區。 裝載之後,這些磁碟區就會與主機電腦隔離。

多個容器可以同時使用相同的磁碟區。 當容器停止使用磁碟區時,也不會自動移除該磁碟區。

在此範例中,您可以在容器主機上建立目錄,並在建立追蹤入口網站容器時,將此磁碟區裝載到容器。 當追蹤入口網站記錄資料時,您就能透過容器主機的檔案系統存取此資訊。 即使已移除容器,您仍可存取此記錄檔。

Docker 也提供一種方式讓第三方公司建置要作為磁碟區的附加元件。 例如,Azure 儲存體會提供外掛程式,將 Azure 儲存體掛接為 Docker 容器上的磁碟區。

什麼是繫結裝載?

繫結裝載在概念上與磁碟區相同,不過,您可以在主機上裝載任何檔案或資料夾,而不使用特定資料夾。 您也預期主機可以變更這些裝載的內容。 就像磁碟區一樣,如果您裝載繫結裝載且其尚未存在於主機上,就會加以建立。

相較於磁碟區,繫結裝載的功能有限,而且即使效能更佳,其還是取決於具有特定資料夾結構的主機。

磁碟區會被視為優先與容器搭配使用的資料儲存策略。

對於 Windows 容器,有另一個選項可供使用:您可以將 SMB 路徑掛接為磁碟區,並將其提供給容器。 這可讓不同主機上的容器使用相同的永續性儲存體。

Docker 容器網路設定

預設的 Docker 網路設定允許在 Docker 主機上隔離容器。 此功能可讓您建置和設定可安全彼此通訊的應用程式。

Docker 針對 Linux 和 Windows 提供不同的網路設定。

針對 Linux,有六個預先設定的網路選項:

  • 橋接器
  • Host
  • Overlay
  • IPvLan
  • MACvLan

針對 Windows,有六個預先設定的網路選項:

  • NAT (網路位址轉譯)
  • 透明
  • Overlay
  • L2Bridge
  • L2Tunnel

您可以根據容器的網路需求,從這些網路設定中選擇要將哪些設定套用到該容器。

什麼是橋接器網路?

橋接器網路是在未指定任何其他網路設定的情況下啟動時套用到容器的預設設定。 這個網路是容器所使用的內部私人網路,且它會將容器網路與 Docker 主機網路隔離。

橋接器網路中的每個容器都獲指派 IP 位址和子網路遮罩,其中的主機名稱預設為容器名稱。 連線到預設橋接器網路的容器,能夠依 IP 位址存取其他橋接器連線的容器。 橋接器網路不允許使用主機名稱在容器之間進行通訊。

根據預設,Docker 不會發佈任何容器連接埠。 若要啟用容器連接埠與 Docker 主機連接埠之間的連接埠對應,請使用 Docker 連接埠 --publish 旗標。

Publish 旗標可以有效地設定對應連接埠的防火牆規則。

在此範例中,瀏覽至連接埠 80 的用戶端可以存取您的追蹤入口網站。 您必須將連接埠 80 從容器對應到主機上的可用連接埠。 您在主機上開啟了連接埠 8080,這可讓您設定如下所示的旗標:

--publish 8080:80

任何瀏覽至 Docker 主機 IP 和連接埠 8080 的用戶端都可存取追蹤入口網站。

除了 Linux 特定設定外,Windows 主機上的 NAT 網路功能與橋接器網路的功能相同。 此外,NAT 是 Windows 上的預設網路,除非另有指定,否則所有容器都會與其連線。

什麼是主機網路?

主機網路可讓您直接在主機網路上執行容器。 此設定會在網路層級上有效地移除主機和容器間的隔離。

在此範例中,假設您決定將網路設定變更為主機網路選項。 您的追蹤入口網站仍然可以使用主機 IP 存取。 您現在可以使用眾所周知的連接埠 80,而不是對應的連接埠。

請記住,容器只能使用主機尚未使用的連接埠。

在 Windows 上,主機網路無法使用。 在 Windows 主機上,沒有選項可在主機與容器之間共用相同的 IP 位址 (網路堆疊)。 NAT 網路功能與橋接器網路功能非常類似,而且重迭選項會從與主機相同的網路提供 IP 位址給容器,而不是提供 相同 的 IP 位址。

重迭和其他網路選項

針對更進階的案例,Linux 和 Windows 都提供其他網路選項。 例如,重迭選項會從主機網路建立虛擬交換器,讓該網路上的容器可以從 DHCP 伺服器取得 IP 位址,或使用該網路區段中的 IP 位址來運作。 此外,Docker 可讓第三方廠商建立網路外掛程式。

什麼是無網路?

若要停用容器的網路功能,請使用 網路選項。 如果您有未使用網路的應用程式,或如果您只是想要驗證應用程式在容器中是否如預期般執行,這個選項可能會很有用。

作業系統考量

請記住,Docker 網路設定選項的桌面作業系統之間有一些差異。 例如,使用橋接器網路時,無法使用 macOS 上的 Docker0 網路介面,而且 Windows 和 macOS 桌上型電腦都不支援使用主機網路設定。

這些差異可能會影響開發人員設定其工作流程以管理容器開發的方式。 此外,容器協調器也可能會在 Docker 設定之上提供其他網路設定。

檢定您的知識

1.

容器會使用 --publish 8080:80 旗標啟動。 下列哪一個選項是最可能用於容器的網路設定?

2.

哪種儲存選項是允許主機和容器共用檔案來管理名稱伺服器解析的最佳選擇;例如,Linux 上的 resolve.conf 檔案?