6.1 Powody ograniczania zasobów kontenerów
Docker świetnie radzi sobie z zarządzaniem zasobami kontenerów, co pozwala efektywnie rozdzielać moc systemu i unikać zbędnych konfliktów między kontenerami. Jest to szczególnie ważne, aby aplikacja w jednym kontenerze nie "pożerała" wszystkich zasobów i nie spowalniała pracy innych usług. Ograniczenie takich zasobów, jak procesor (CPU) i pamięć, pomaga unikać przeciążeń, utrzymywać stabilność systemu i gwarantować, że wszystkie aplikacje działają przewidywalnie. W tym wykładzie omówimy, jak ustawić limity na wykorzystanie CPU i pamięci, aby system pozostawał produktywny nawet przy dużym obciążeniu.
Dlaczego ważne jest ograniczanie zasobów kontenerów:
- stabilność: zapobieganie sytuacji, gdy jeden kontener zabiera wszystkie zasoby, przez co inne kontenery lub sam system zaczynają zwalniać.
- efektywność: lepsze rozdzielanie zasobów między kontenerami, aby maksymalnie efektywnie wykorzystywać moc systemu.
- ochrona: ograniczenie zasobów pomaga unikać problemów z kontenerami, które mogą przypadkowo lub celowo przeciążyć system.
6.2 Limity użycia CPU
Docker oferuje kilka sposobów na ograniczenie użycia CPU
przez kontenery.
Ważne!
Pod CPU
tutaj rozumie się jedno rdzenie procesora, a nie cały procesor. Czterordzeniowy procesor ma 4 jednostki CPU
.
1. Ograniczenie udziału CPU (--cpu-shares)
Parametr --cpu-shares
ustawia względne wartości przyorytetu użycia CPU przez kontener. Domyślna wartość to 1024. Jest to wartość względna, co oznacza, że kontener z --cpu-shares=512
będzie miał połowę priorytetu kontenera z --cpu-shares=1024
.
Przykład użycia:
W tym przykładzie kontener high_priority_container
będzie miał wyższy priorytet w alokacji CPU
niż 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. Ograniczenie liczby CPU (--cpus)
Parametr --cpus
ustawia dokładną liczbę CPU
, która będzie dostępna dla kontenera. Na przykład wartość 1.5 oznacza, że kontener może używać 1.5 CPU
.
Przykład użycia:
Ten przykład ogranicza kontener limited_cpu_container
do użycia nie więcej niż 1.5 CPU
.
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. Ograniczenie czasu użycia CPU
(--cpu-quota i --cpu-period)
Parametry --cpu-quota
i --cpu-period
pozwalają bardziej precyzyjnie kontrolować użycie CPU
. --cpu-period
ustawia interwał czasu w mikrosekundach (domyślnie 100000), a --cpu-quota
ustawia maksymalny czas użycia CPU
w tym okresie.
Przykład użycia:
W tym przykładzie kontener custom_cpu_quota_container
będzie używał nie więcej niż 50% CPU
(25000/50000).
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 Limity na użycie pamięci
Ograniczenie pamięci pozwala kontrolować, ile pamięci operacyjnej może użyć kontener. To pomaga uniknąć sytuacji, gdy jeden kontener zaczyna "pożerać" całą pamięć, wpływając na inne procesy i kontenery.
1. Ograniczenie maksymalnej ilości pamięci (--memory)
Parametr --memory
definiuje górny limit pamięci, którą może używać kontener. Jeśli kontener przekroczy ten limit, system zakończy jego działanie.
Przykład użycia:
Ten przykład ogranicza kontener limited_memory_container
do użycia maksymalnie 512 MB pamięci operacyjnej.
docker run -d --name limited_memory_container --memory="512m" nginx
2. Ograniczenie ilości pamięci swap (--memory-swap)
Parametr --memory-swap
definiuje całkowity limit dla pamięci operacyjnej i swap. Na przykład, jeśli --memory
ustawione jest na 512 MB, a --memory-swap
na 1 GB, kontener może użyć do 512 MB pamięci operacyjnej i dodatkowo 512 MB swap.
Przykład użycia:
Ten przykład ogranicza kontener swap_limited_container
do użycia 512 MB pamięci operacyjnej i 512 MB swap.
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. Ograniczenie użycia pamięci bez swap (--memory-swap=-1)
Aby zabronić używania swap, ustaw parametr --memory-swap
na wartość -1.
Przykład użycia:
Ten przykład ogranicza kontener no_swap_container
do 512 MB pamięci operacyjnej bez możliwości użycia swap.
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 Praktyczne scenariusze
1. Uruchamianie zadań o wysokim i niskim priorytecie
Jeśli na jednym serwerze są wykonywane zarówno ważne, jak i drugorzędne zadania, parametr --cpu-shares
pomaga podzielić zasoby tak, aby krytyczne zadania otrzymały więcej 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. Ograniczanie zasobów do testowania
Dla testowania aplikacji w warunkach ograniczonych zasobów można ustawić sztywne limity na CPU
i pamięć. To pomaga zrozumieć, jak aplikacja będzie działać przy takich ograniczeniach.
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. Ochrona przed wyczerpaniem zasobów
Aby uniknąć sytuacji, w której jeden kontener zużywa wszystkie dostępne zasoby systemu, można ustawić limity na pamięć i CPU
dla wszystkich kontenerów.
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION