在Docker中,如何控制容器佔用系統資源(CPU,記憶體)的份額?

黄嘉波發表於2024-03-10

在Docker中,你可以透過多種方式來控制容器對系統資源(如CPU和記憶體)的使用份額,以確保容器不會過度消耗宿主機的資源,並與其他容器公平地共享資源。以下是一些常用的方法:

一. 控制CPU資源
  1. CPU份額(CPU Shares)
    Docker使用CPU份額來分配CPU時間。預設情況下,所有容器具有相同的CPU份額,這意味著它們將等比例地獲得CPU時間。你可以透過--cpu-shares標誌來設定容器的CPU份額。值越高,容器獲得的CPU時間就越多。

    docker run --cpu-shares 512 my-image
    

    請注意,這種方法只在CPU密集型任務之間有效,並且只在多核CPU上起作用。

  2. CPU限制(CPU Quotas)
    你可以使用--cpus標誌來限制容器可以使用的CPU核心數。這對於確保容器不會使用超過指定數量的CPU核心非常有用。

    docker run --cpus 1.5 my-image
    

    這將限制容器只能使用1.5個CPU核心。

  3. CPU週期和配額(CPU Period and Quota)
    你還可以使用--cpu-period--cpu-quota標誌來更精細地控制容器的CPU使用率。--cpu-period是CPU時間片的長度,而--cpu-quota是在一個週期內容器可以使用的CPU時間。

    docker run --cpu-period 100000 --cpu-quota 50000 my-image
    

    這將限制容器在每100,000微秒(0.1秒)的週期中只能使用50,000微秒的CPU時間。

二. 控制記憶體資源
  1. 記憶體限制(Memory Limit)
    使用--memory標誌來限制容器可以使用的記憶體量。這有助於防止容器消耗過多的記憶體資源。

    docker run --memory 512m my-image
    

    這將限制容器只能使用512MB的記憶體。

  2. 記憶體交換(Memory Swap)
    使用--memory-swap標誌來設定容器的記憶體加交換空間的總限制。這允許容器使用超過其分配的記憶體量,但會將部分資料交換到磁碟上。

    docker run --memory 512m --memory-swap 1g my-image
    

    這將限制容器的總記憶體使用量(包括交換空間)為1GB。

  3. 記憶體限制預留(Memory Reservation)
    使用--memory-reservation標誌來為容器預留一定數量的記憶體。這確保了容器至少有這麼多記憶體可用,但不會限制其使用更多的記憶體(如果可用)。

    docker run --memory-reservation 256m my-image
    

    這將為容器預留256MB的記憶體。

  4. 核心記憶體限制(Kernel Memory Limit)
    使用--kernel-memory標誌來限制容器可以使用的核心記憶體量。核心記憶體是作業系統用於快取和緩衝區的記憶體。

    docker run --kernel-memory 64m my-image
    

    這將限制容器只能使用64MB的核心記憶體。

綜上所述,Docker可以靈活地控制容器佔用系統CPU和記憶體資源的份額,以滿足不同的資源隔離和效能要求。此外,還可以結合 docker-compose.yml 檔案或者 Kubernetes 中的相關資源請求與限制進行更復雜的資源管理。

相關文章