Что означает ошибка OOM
Ошибка Docker OOM (Out‑of‑Memory) возникает, когда выделенный контейнеру объем памяти исчерпан, и Linux принудительно останавливает процесс. Docker завершает контейнер со статусом Exit Code 137 и выводит сообщение примерно следующего содержания:
Error response from daemon: Out of memory: Kill your container.
Контейнер останавливается, чтобы не повлиять на хост, но это приводит к недоступности приложения.
Причины возникновения
- Недостаточный лимит памяти – установлен слишком низкий
--memoryилиmemory.limitвdocker-compose.yml. - Утечка памяти в приложении – код постепенно расходует RAM без освобождения.
- Недостаток системной памяти – хост перегружен другими процессами, оставляя мало ресурсов для контейнеров.
- Отсутствие свопа – контейнер не может использовать своп-память, поэтому любое превышение лимита приводит к OOM.
- Низкий приоритет OOM – контейнер имеет высокий приоритет для системного OOM-киллера, и его убивают первым.
Способы решения
Способ 1: Увеличить лимит памяти через docker run
Если ошибка возникает при запуске контейнера, задайте больший объем памяти:
# Запуск контейнера с 2 GB RAM и 2.5 GB свопа
docker run -d --memory=2g --memory-swap=2.5g your_image
💡 Совет: Значение
--memory-swapможет быть больше--memory, чтобы позволить использование свопа при переполнении лимита.
Способ 2: Настроить своп-память
Для существующих контейнеров своп можно добавить с помощью docker run --memory-swap. В docker-compose.yml используйте deploy.resources.limits.memory:
services:
web:
image: your_image
deploy:
resources:
limits:
memory: 2G
Способ 3: Оптимизировать приложение внутри контейнера
Уменьшение потребления памяти часто эффективнее, чем увеличение лимитов:
- Закройте неиспользуемые соединения или базы данных.
- Используйте
ulimit -v 3000000перед запуском приложения. - Проверьте код на утечки памяти (например,
valgrindв Python илиheapdumpв Node.js).
⚠️ Важно: Тестирование под нагрузкой (
stress-test) поможет выявить скрытые утечки.
Способ 4: Настроить OOM-адвоката
Docker позволяет снизить приоритет контейнера при нехватке памяти хоста:
docker run -d --oom-score-adj=-500 your_image
Значение -500 делает контейнер менее приоритетным для системного OOM-киллера.
Способ 5: Использовать docker compose с резервированием памяти
Для многосервисных приложений задайте общий лимит в docker-compose.yml:
version: '3.8'
services:
app:
image: your_image
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 512M
Это гарантирует, что сервис получит хотя бы 512 MB и не более 4 GB.
Профилактика
- Профилируйте память перед запуском в продакшн (
docker stats+ внутренние инструменты). - Настройте мониторинг для отслеживания роста потребления (
prometheus/grafana). - Регулярно пересматривайте лимиты по мере роста нагрузки.
- Включите своп или увеличьте объем памяти на хосте, если контейнеры часто достигают лимита.
- Обновляйте зависимости и следите за исправлениями, устраняющими утечки памяти.
Выполнив эти рекомендации, вы сократите вероятность возникновения ошибки Docker OOM и стабилизируете работу контейнеров.