覆蓋容器預設值

說明

當 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 檔案,您可以將 --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 儀表板的**容器**檢視,驗證這兩個容器是否正在執行。

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

在受控網路中執行 Postgres 容器

預設情況下,當您執行容器時,容器會自動連線到一個名為橋接網路的特殊網路。此橋接網路充當虛擬橋接,允許同一個主機上的容器相互通訊,同時將它們與外部世界和其他主機隔離。對於大多數容器互動來說,這是一個方便的起點。但是,對於特定場景,您可能希望對網路配置進行更多控制。

自定義網路此時就派上用場了。您可以透過將 --network 標誌與 docker run 命令一起傳遞來建立自定義網路。所有沒有 --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 儀表板驗證身份驗證。

    開啟 Docker 儀表板,選擇**Postgres** 容器,然後選擇**Exec** 進入容器 shell。您可以鍵入以下命令來連線到 Postgres 資料庫

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

    注意

    PostgreSQL 映象在本地設定了信任身份驗證,因此您可能會注意到從本地主機(同一容器內)連線時不需要密碼。但是,如果從其他主機/容器連線,則需要密碼。

使用 docker run 覆蓋預設 CMD 和 ENTRYPOINT

您也可以使用以下命令,透過 `docker run` 命令直接覆蓋預設設定

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

此命令執行一個 Postgres 容器,設定一個用於密碼身份驗證的環境變數,覆蓋預設啟動命令並配置主機名和埠對映。

其他資源

下一步

現在您已經瞭解瞭如何覆蓋容器預設設定,接下來學習如何持久化容器資料。