6.1 為什麼要限制容器的資源
Docker 完全能夠管理容器的資源,這讓系統資源能被高效地分配,並避免容器之間不必要的衝突。這件事尤其重要,因為我們不希望某個容器上的應用程式「吃掉」所有資源,導致其他服務停止運作。限制像 CPU 和記憶體這樣的資源,可以避免超載,保持系統穩定性,並確保所有應用能正常運行。在這堂課中,我們會學到如何設置 CPU 和記憶體的使用限制,確保系統即使在高負載情況下仍保持高效。
為什麼限制容器資源很重要:
- 穩定性: 防止某一個容器佔用所有資源,導致其他容器或系統本身開始減速。
- 效率: 更好地分配資源,讓系統性能被最大化利用。
- 保護: 限制資源幫助避免因為容器意外或者故意超載系統而出現的問題。
6.2 使用 CPU 的限制
Docker 提供了一些方式來限制容器使用 CPU 的能力。
重要! 這裡的 CPU 是指單個處理器核心,而不是整個處理器。四核心處理器會有 4 個 CPU。
1. 限制 CPU (--cpu-shares) 的分配比例
參數 --cpu-shares 用來設定容器使用 CPU 的相對優先級。默認值是 1024。這是一個相對值,這表示設定 --cpu-shares=512 的容器會比設定 --cpu-shares=1024 的容器低一半的優先級。
使用範例:
在這個範例中,容器 high_priority_container 在分配 CPU 時,會比 low_priority_container 有更高的優先權。
docker run -d --name low_priority_container --cpu-shares=512 nginx
docker run -d --name high_priority_container --cpu-shares=2048 nginx
2. 限制 CPU (--cpus) 的數量
參數 --cpus 設定容器可用的 CPU 數量。例如,值為 1.5 表示容器可以使用 1.5 個 CPU。
使用範例:
這個範例限制了 limited_cpu_container 容器最多只能使用 1.5 個 CPU。
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. 限制 CPU 時間的使用 (--cpu-quota 和 --cpu-period)
參數 --cpu-quota 和 --cpu-period 允許更細緻地調整 CPU 的使用量。--cpu-period 設定以微秒為單位的時間間隔(默認為 100000),而 --cpu-quota 設定該期間內可使用 CPU 的最長時間。
使用範例:
在這個範例中,容器 custom_cpu_quota_container 使用的 CPU 不會超過 50%(25000/50000)。
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 記憶體使用限制
記憶體限制能控制容器最多可以使用多少記憶體。這有助於避免某個容器開始「吃掉」所有記憶體,影響到其他進程和容器。
1. 記憶體最大限制 (--memory)
參數 --memory 設定容器可使用記憶體的上限。如果容器超出這個限制,系統會終止它。
使用範例:
此範例限制容器 limited_memory_container 使用不超過 512 MB 的記憶體。
docker run -d --name limited_memory_container --memory="512m" nginx
2. 記憶體加上 swap 限制 (--memory-swap)
參數 --memory-swap 設定記憶體和 swap 總量的上限。例如若 --memory 設定為 512 MB,--memory-swap 設定為 1 GB,容器最多可以使用 512 MB 記憶體以及額外 512 MB 的 swap。
使用範例:
此範例限制容器 swap_limited_container 使用 512 MB 記憶體和 512 MB swap。
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. 禁止使用 swap 的記憶體限制 (--memory-swap=-1)
若要禁止使用 swap,將參數 --memory-swap 設置為 -1。
使用範例:
此範例限制容器 no_swap_container 使用 512 MB 記憶體且不能使用 swap。
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 實際場景應用
1. 執行高優先級與低優先級任務
如果在同一台伺服器上同時執行重要的和次要的任務,參數 --cpu-shares 可以幫助分配資源,確保關鍵任務獲得更多 CPU。
docker run -d --name high_priority_task --cpu-shares=2048 my_high_priority_image
docker run -d --name low_priority_task --cpu-shares=512 my_low_priority_image
2. 測試資源限制
為了在有限資源條件下測試應用程式,可以設定嚴格的 CPU 和記憶體限制。這有助於了解應用程式在這些限制下的運行狀況。
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. 防止資源耗盡
為了避免一個容器耗盡系統所有可用資源,可以為所有容器設定記憶體與 CPU 的限制。
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION