覆寫容器預設值
說明
當 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 指令來覆寫容器預設值。
- 下載並安裝 Docker Desktop。
執行多個 Postgres 資料庫執行個體
使用以下指令啟動包含 Postgres 映像檔的容器:
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres這將在背景啟動 Postgres 資料庫,監聽標準容器連接埠
5432,並對應至主機機器的5432連接埠。啟動第二個對應至不同連接埠的 Postgres 容器。
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres這將在背景啟動另一個 Postgres 容器,監聽容器內的標準 Postgres 連接埠
5432,但對應至主機機器的5433連接埠。您覆寫了主機連接埠,只是為了確保這個新容器不會與現有的執行中容器發生衝突。前往 Docker Desktop 儀表板中的容器 (Containers) 檢視,驗證兩個容器是否都在執行中。

在受控網路中執行 Postgres 容器
預設情況下,當您執行容器時,它們會自動連接到一個稱為橋接網路 (bridge network) 的特殊網路。這個橋接網路就像一個虛擬橋樑,允許同一台主機上的容器彼此通訊,同時將它們與外界和其他主機隔離。對於大多數容器互動而言,這是一個方便的起點。然而,對於特定場景,您可能需要對網路配置有更多的控制權。
這就是自訂網路發揮作用的地方。您可以透過在 docker run 指令中傳遞 --network 標記來建立自訂網路。所有沒有 --network 標記的容器都會被附加到預設的橋接網路。
請按照步驟了解如何將 Postgres 容器連接到自訂網路。
使用以下指令建立一個新的自訂網路:
$ docker network create mynetwork透過執行以下指令驗證網路:
$ docker network ls此指令會列出所有網路,包括剛建立的 "mynetwork"。
使用以下指令將 Postgres 連接到自訂網路:
$ docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgres這將在背景啟動 Postgres 容器,對應至主機連接埠 5434,並附加到
mynetwork網路。您傳遞了--network參數來覆寫容器預設值,將容器連接到自訂 Docker 網路,以實現更好的隔離性和與其他容器的通訊。您可以使用docker network inspect指令來查看容器是否已連接到此新的橋接網路。預設橋接網路與自訂網路的主要區別
- DNS 解析:預設情況下,連接到預設橋接網路的容器可以互相通訊,但只能透過 IP 位址(除非使用被視為過時的
--link選項)。由於各種 技術缺陷,不建議將其用於生產環境。在自訂網路上,容器可以透過名稱或別名互相解析。 - 隔離性:所有未指定
--network的容器都會附加到預設橋接網路,因此存在風險,因為不相關的容器也能夠進行通訊。使用自訂網路可以提供一個範圍受限的網路,其中只有連接到該網路的容器才能夠通訊,從而提供更好的隔離性。
- DNS 解析:預設情況下,連接到預設橋接網路的容器可以互相通訊,但只能透過 IP 位址(除非使用被視為過時的
管理資源
預設情況下,容器的資源使用量沒有限制。然而,在共用系統上,有效管理資源至關重要。重要的是不要讓執行中的容器消耗過多主機機器的記憶體。
這又是 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 時。
建立一個內容如下的
compose.yml檔案:services: postgres: image: postgres entrypoint: ["docker-entrypoint.sh", "postgres"] command: ["-h", "localhost", "-p", "5432"] environment: POSTGRES_PASSWORD: secret此 Compose 檔案定義了一個名為
postgres的服務,它使用官方的 Postgres 映像檔、設定一個進入點腳本,並以密碼驗證方式啟動容器。執行以下指令啟動服務:
$ docker compose up -d此指令會啟動 Docker Compose 檔案中定義的 Postgres 服務。
使用 Docker Desktop 儀表板驗證驗證結果。
打開 Docker Desktop 儀表板,選擇 Postgres 容器並選擇 Exec 以進入容器 Shell。您可以輸入以下指令連接到 Postgres 資料庫:
# psql -U postgres
注意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 容器,設定密碼驗證的環境變數,覆寫預設啟動指令,並設定主機名稱與連接埠對應。
其他資源
下一步
現在您已經了解了如何覆寫容器預設值,是時候學習如何保存容器資料了。
保存容器資料