覆寫容器預設值
說明
當 Docker 容器啟動時,它會執行一個應用程式或指令。容器從其映像檔的設定中取得這個可執行檔(指令碼或檔案)。容器附帶的預設設定通常運作良好,但您可以根據需要更改它們。這些調整有助於容器的程式完全按照您想要的方式執行。
例如,如果您有一個現有的資料庫容器正在標準埠上監聽,並且您想要執行同一個資料庫容器的新執行個體,那麼您可能想要更改新容器監聽的埠設定,以免與現有容器衝突。有時,如果程式需要更多資源來處理繁重的工作負載,您可能想要增加容器可用的記憶體,或者設定環境變數以提供程式正常運作所需的特定設定詳細資訊。
docker run
指令提供了一種強大的方法來覆寫這些預設值,並根據您的喜好調整容器的行為。該指令提供了多個旗標,讓您可以動態自訂容器行為。
以下是一些您可以實現此目標的方法。
覆寫網路埠
有時您可能想要將資料庫執行個體用於開發和測試目的。在同一個埠上執行這些資料庫執行個體可能會發生衝突。您可以在 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
檔案,您可以在docker run
指令中傳遞--env-file
選項。$ docker run --env-file .env postgres env
限制容器消耗資源
您可以使用 --memory
和 --cpus
旗標搭配 docker run
指令來限制容器可以使用的 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 儀表板中的**容器**檢視,確認兩個容器都在執行中。
在受控網路中執行 Postgres 容器
根據預設,當您執行容器時,它們會自動連線到一個稱為橋接網路的特殊網路。這個橋接網路就像一個虛擬橋樑,允許位於同一個主機上的容器相互通訊,同時將它們與外界和其他主機隔離。對於大多數容器互動來說,這是一個方便的起點。但是,對於特定情況,您可能需要更多地控制網路設定。
這就是自訂網路的用武之地。您可以透過在 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
選項,這被認為是 legacy)。由於存在各種技術缺陷,因此不建議在生產環境中使用。在自訂網路上,容器可以透過名稱或別名相互解析。 - 隔離性:所有未指定
--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 Dashboard 驗證身份驗證。
開啟 Docker Desktop Dashboard,選擇 **Postgres** 容器,然後選擇 **Exec** 進入容器 shell。您可以輸入以下指令來連線到 Postgres 資料庫
# psql -U postgres
注意事項
PostgreSQL 映像會在本地設定信任驗證,因此您可能會注意到從本地主機(在同一個容器內)連線時不需要密碼。但是,如果從不同的主機/容器連線,則需要密碼。
使用 docker run
覆寫預設的 CMD 和 ENTRYPOINT
您也可以使用以下指令直接透過 docker run
指令覆寫預設值
$ docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432
此指令會執行一個 Postgres 容器,設定密碼驗證的環境變數,覆寫預設啟動指令,並設定主機名稱和連接埠映射。
其他資源
後續步驟
現在您已經了解了如何覆寫容器預設值,接下來將學習如何保存容器資料。