JavaRush /Курсы /Модуль 2: Fullstack /Управление ресурсами контейнеров

Управление ресурсами контейнеров

Модуль 2: Fullstack
12 уровень , 5 лекция
Открыта

6.1 Причины ограничивать ресурсы контейнеров

Docker отлично справляется с управлением ресурсами контейнеров, что позволяет эффективно распределять мощность системы и избегать лишних конфликтов между контейнерами. Это особенно важно, чтобы приложение на одном контейнере не "съедало" все ресурсы и не тормозило работу других сервисов. Ограничение таких ресурсов, как процессор (CPU) и память, помогает избежать перегрузок, поддерживать стабильность системы и гарантировать, что все приложения работают предсказуемо. В этой лекции мы разберём, как установить лимиты на использование CPU и памяти, чтобы система оставалась продуктивной даже при высокой нагрузке.

Почему важно ограничивать ресурсы контейнеров:

  1. стабильность: предотвращение ситуации, когда один контейнер забирает все ресурсы, из-за чего другие контейнеры или сама система начинают тормозить.
  2. эффективность: лучшее распределение ресурсов между контейнерами, чтобы использовать мощность системы максимально продуктивно.
  3. защита: ограничение ресурсов помогает избежать проблем с контейнерами, которые могут случайно или намеренно перегрузить систему.

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.

Terminal

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.

Terminal


        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 будет использовать не более 50% CPU (25000/50000).

Terminal


        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 оперативной памяти.

Terminal

docker run -d --name limited_memory_container --memory="512m" nginx

2. Ограничение объема подкачки памяти (--memory-swap)

Параметр --memory-swap задаёт общий предел для оперативной памяти и подкачки. Например, если --memory установлено на 512 MB, а --memory-swap на 1 GB, контейнер сможет использовать до 512 MB оперативной памяти и ещё 512 MB подкачки.

Пример использования:

Этот пример ограничивает контейнер swap_limited_container использованием 512 MB оперативной памяти и 512 MB подкачки.

Terminal

docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx

3. Ограничение использования памяти без подкачки (--memory-swap=-1)

Чтобы запретить использование подкачки, установите параметр --memory-swap в значение -1.

Пример использования:

Этот пример ограничивает контейнер no_swap_container 512 MB оперативной памяти без возможности использовать подкачку.

Terminal

docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx

6.4 Практические сценарии

1. Запуск высокоприоритетных и низкоприоритетных задач

Если на одном сервере выполняются как важные, так и второстепенные задачи, параметр --cpu-shares помогает распределить ресурсы так, чтобы критически важные задачи получили больше CPU.

Terminal

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 и память. Это помогает понять, как приложение будет работать при таких ограничениях.

Terminal

docker run -d --name test_container --cpus="1" --memory="256m" my_test_image

3. Защита от исчерпания ресурсов

Чтобы избежать ситуации, когда один контейнер использует все доступные ресурсы системы, можно установить лимиты на память и CPU для всех контейнеров.

Terminal

docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
3
Задача
Модуль 2: Fullstack, 12 уровень, 5 лекция
Недоступна
Ограничение использования CPU контейнером
Ограничение использования CPU контейнером
3
Задача
Модуль 2: Fullstack, 12 уровень, 5 лекция
Недоступна
Установка лимитов на память контейнера
Установка лимитов на память контейнера
3
Задача
Модуль 2: Fullstack, 12 уровень, 5 лекция
Недоступна
Ограничение использования CPU и памяти контейнера
Ограничение использования CPU и памяти контейнера
3
Задача
Модуль 2: Fullstack, 12 уровень, 5 лекция
Недоступна
Ограничение объема подкачки памяти контейнера
Ограничение объема подкачки памяти контейнера
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ibrodin2 Уровень 2 Expert
6 июля 2025
Неверное утверждение!!! ``` Чтобы запретить использование подкачки, установите параметр --memory-swap в значение -1. ``` If --memory-swap is explicitly set to -1, the container is allowed to use unlimited swap, up to the ... "-1" наоборот включает неограниченный своп
Slevin Уровень 7
4 октября 2025
Спасибо за замечание
Константин Contact Уровень 20
31 марта 2025
Косяк валидатора детектед! memory_swap="1g" не проходит, только 1024m
belkin Уровень 10
28 марта 2025
В последней задаче --memory-swap="1g" при проверке выдает ошибку. А --memory-swap="1024m" принимает.
Евгений Уровень 82
15 мая 2025
и также принимает --memory-swap 1g