覆寫容器預設值

說明

當 Docker 容器啟動時,它會執行一個應用程式或指令。容器從其映像檔的配置中獲取此可執行檔(腳本或檔案)。容器隨附的預設設定通常運作良好,但您可以在需要時進行更改。這些調整有助於讓容器內的程式精確地按照您的需求執行。

例如,如果您現有一個正在監聽標準連接埠的資料庫容器,並且想要執行相同資料庫容器的新執行個體,您可能需要更改新容器所監聽的連接埠設定,以避免與現有的容器發生衝突。有時,如果程式需要更多資源來處理繁重的工作負載,您可能需要增加分配給容器的記憶體,或者設定環境變數來提供程式正常運作所需的特定配置細節。

docker run 指令提供了一種強大的方式來覆寫這些預設值,並根據您的喜好調整容器的行為。該指令提供了多個標記(flags),讓您可以即時自訂容器行為。

以下是幾種實現此目的的方法。

覆寫網路連接埠

有時您可能希望在開發和測試時使用獨立的資料庫執行個體。在同一個連接埠上執行這些資料庫執行個體可能會發生衝突。您可以在 docker run 中使用 -p 選項將容器連接埠對應至主機連接埠,從而允許您在不發生任何衝突的情況下執行多個容器執行個體。

$ docker run -d -p HOST_PORT:CONTAINER_PORT postgres

設定環境變數

此選項會在容器內設定環境變數 foo,其值為 bar

$ docker run -e foo=bar postgres env

您將會看到類似下方的輸出

HOSTNAME=2042f2e6ebe4
foo=bar
提示

.env 檔案提供了一種方便的方式來為您的 Docker 容器設定環境變數,而無需在指令列中使用大量的 -e 標記。若要使用 .env 檔案,您可以將 --env-file 選項傳遞給 docker run 指令。

$ docker run --env-file .env postgres env

限制容器資源使用

您可以在 docker run 指令中使用 --memory--cpus 標記來限制容器可使用的 CPU 和記憶體數量。例如,您可以為 Python API 容器設定記憶體限制,防止其在主機上消耗過多資源。指令如下:

$ docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres

此指令將容器記憶體使用量限制為 512 MB,並將 CPU 配額定義為半個核心(0.5)。

監控即時資源使用情況

您可以使用 docker stats 指令來監控執行中容器的即時資源使用情況。這有助於您了解分配的資源是否足夠,或者是否需要調整。

透過有效利用這些 docker run 標記,您可以根據您的特定需求調整容器化應用程式的行為。

試試看

在本實作指南中,您將了解如何使用 docker run 指令來覆寫容器預設值。

  1. 下載並安裝 Docker Desktop。

執行多個 Postgres 資料庫執行個體

  1. 使用以下指令啟動包含 Postgres 映像檔的容器:

    $ docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres
    

    這將在背景啟動 Postgres 資料庫,監聽標準容器連接埠 5432,並對應至主機機器的 5432 連接埠。

  2. 啟動第二個對應至不同連接埠的 Postgres 容器。

    $ docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres
    

    這將在背景啟動另一個 Postgres 容器,監聽容器內的標準 Postgres 連接埠 5432,但對應至主機機器的 5433 連接埠。您覆寫了主機連接埠,只是為了確保這個新容器不會與現有的執行中容器發生衝突。

  3. 前往 Docker Desktop 儀表板中的容器 (Containers) 檢視,驗證兩個容器是否都在執行中。

    A screenshot of the Docker Desktop Dashboard showing the running instances of Postgres containers

在受控網路中執行 Postgres 容器

預設情況下,當您執行容器時,它們會自動連接到一個稱為橋接網路 (bridge network) 的特殊網路。這個橋接網路就像一個虛擬橋樑,允許同一台主機上的容器彼此通訊,同時將它們與外界和其他主機隔離。對於大多數容器互動而言,這是一個方便的起點。然而,對於特定場景,您可能需要對網路配置有更多的控制權。

這就是自訂網路發揮作用的地方。您可以透過在 docker run 指令中傳遞 --network 標記來建立自訂網路。所有沒有 --network 標記的容器都會被附加到預設的橋接網路。

請按照步驟了解如何將 Postgres 容器連接到自訂網路。

  1. 使用以下指令建立一個新的自訂網路:

    $ docker network create mynetwork
    
  2. 透過執行以下指令驗證網路:

    $ docker network ls
    

    此指令會列出所有網路,包括剛建立的 "mynetwork"。

  3. 使用以下指令將 Postgres 連接到自訂網路:

    $ docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgres
    

    這將在背景啟動 Postgres 容器,對應至主機連接埠 5434,並附加到 mynetwork 網路。您傳遞了 --network 參數來覆寫容器預設值,將容器連接到自訂 Docker 網路,以實現更好的隔離性和與其他容器的通訊。您可以使用 docker network inspect 指令來查看容器是否已連接到此新的橋接網路。

    預設橋接網路與自訂網路的主要區別

    1. DNS 解析:預設情況下,連接到預設橋接網路的容器可以互相通訊,但只能透過 IP 位址(除非使用被視為過時的 --link 選項)。由於各種 技術缺陷,不建議將其用於生產環境。在自訂網路上,容器可以透過名稱或別名互相解析。
    2. 隔離性:所有未指定 --network 的容器都會附加到預設橋接網路,因此存在風險,因為不相關的容器也能夠進行通訊。使用自訂網路可以提供一個範圍受限的網路,其中只有連接到該網路的容器才能夠通訊,從而提供更好的隔離性。

管理資源

預設情況下,容器的資源使用量沒有限制。然而,在共用系統上,有效管理資源至關重要。重要的是不要讓執行中的容器消耗過多主機機器的記憶體。

這又是 docker run 指令大顯身手的地方。它提供了像 --memory--cpus 這樣的標記來限制容器可使用的 CPU 和記憶體量。

$ docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres

--cpus 標記指定了容器的 CPU 配額。在這裡,它被設定為半個 CPU 核心 (0.5),而 --memory 標記則指定了容器的記憶體限制。在此例中,它被設定為 512 MB。

在 Docker Compose 中覆寫預設的 CMD 與 ENTRYPOINT

有時,您可能需要覆寫 Docker 映像檔中定義的預設指令 (CMD) 或進入點 (ENTRYPOINT),特別是在使用 Docker Compose 時。

  1. 建立一個內容如下的 compose.yml 檔案:

    services:
      postgres:
        image: postgres
        entrypoint: ["docker-entrypoint.sh", "postgres"]
        command: ["-h", "localhost", "-p", "5432"]
        environment:
          POSTGRES_PASSWORD: secret 

    此 Compose 檔案定義了一個名為 postgres 的服務,它使用官方的 Postgres 映像檔、設定一個進入點腳本,並以密碼驗證方式啟動容器。

  2. 執行以下指令啟動服務:

    $ docker compose up -d
    

    此指令會啟動 Docker Compose 檔案中定義的 Postgres 服務。

  3. 使用 Docker Desktop 儀表板驗證驗證結果。

    打開 Docker Desktop 儀表板,選擇 Postgres 容器並選擇 Exec 以進入容器 Shell。您可以輸入以下指令連接到 Postgres 資料庫:

    # psql -U postgres
    
    A screenshot of the Docker Desktop Dashboard selecting the Postgres container and entering into its shell using EXEC button
    注意

    PostgreSQL 映像檔會在本地設定信任驗證 (trust authentication),因此您可能會發現從 localhost(在同一個容器內)連接時不需要密碼。然而,如果從不同的主機/容器連接,則需要密碼。

使用 docker run 覆寫預設的 CMD 與 ENTRYPOINT

您也可以直接使用 docker run 指令並配合以下指令來覆寫預設值:

$ docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432

此指令執行 Postgres 容器,設定密碼驗證的環境變數,覆寫預設啟動指令,並設定主機名稱與連接埠對應。

其他資源

下一步

現在您已經了解了如何覆寫容器預設值,是時候學習如何保存容器資料了。保存容器資料

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.