Короткий ответ
Флаг --memory (и опционально --memory-swap) ограничивает объём памяти контейнера, флаг --cpus ограничивает долю процессорного времени (например, 1.5 ядра); при превышении лимита памяти процесс в контейнере получает OOM kill.
Как это работает подробнее
оба флага транслируются в настройки Linux cgroups для контейнера. --memory=512m задаёт жёсткий верхний предел использования RAM — при его превышении ядро посылает OOM killer сигнал процессу внутри контейнера. --cpus=1.5 задаёт квоту CPU-времени за период, ограничивая максимальную долю процессора, которую может использовать контейнер, независимо от того, сколько ядер физически доступно на хосте.
Пример кода
Пример конфигурации
$ docker run -d --name limited --memory=512m --cpus=1.5 myapp
$ docker inspect limited --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}'
536870912 1500000000Что использовать на практике
- Практика. лимиты обязательно нужны на production-хостах с несколькими контейнерами, чтобы один "прожорливый" сервис не мог положить остальные (noisy neighbor); значения лимитов стоит подбирать на основе реального профиля нагрузки приложения, а не произвольно.
Подводные камни
- Риск. задают лимит памяти заметно ниже реальных потребностей приложения "на всякий случай", что приводит к частым OOM kill и перезапускам; путают лимит CPU с лимитом числа ядер —
--cpus=2не "привязывает" контейнер строго к 2 физическим ядрам, а ограничивает суммарную долю CPU-времени, эквивалентную двум ядрам.