Linux OOMВысокая

Docker OOM: исправление ошибки нехватки памяти и перезапуск контейнеров

Статья объясняет, почему Docker выдает ошибку OOM на хостах Linux, как определить ее причину и предлагает несколько эффективных способов ее устранить, включая изменение лимитов памяти и оптимизацию работы контейнеров.

Обновлено 31 июля 2026 г.
5-10 мин
Средняя
FixPedia Team
Применимо к:Docker 20.10+ (Linux)Docker 23.04+ (Linux)Ubuntu 22.04 LTSCentOS 8

Что означает ошибка OOM

Ошибка Docker OOM (Out‑of‑Memory) возникает, когда выделенный контейнеру объем памяти исчерпан, и Linux принудительно останавливает процесс. Docker завершает контейнер со статусом Exit Code 137 и выводит сообщение примерно следующего содержания:

Error response from daemon: Out of memory: Kill your container.

Контейнер останавливается, чтобы не повлиять на хост, но это приводит к недоступности приложения.

Причины возникновения

  1. Недостаточный лимит памяти – установлен слишком низкий --memory или memory.limit в docker-compose.yml.
  2. Утечка памяти в приложении – код постепенно расходует RAM без освобождения.
  3. Недостаток системной памяти – хост перегружен другими процессами, оставляя мало ресурсов для контейнеров.
  4. Отсутствие свопа – контейнер не может использовать своп-память, поэтому любое превышение лимита приводит к OOM.
  5. Низкий приоритет 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 и стабилизируете работу контейнеров.

Часто задаваемые вопросы

Что означает ошибка Docker OOM?
Как диагностировать OOM в Docker?
Можно ли предотвратить OOM при работе с Docker?
Почему контейнер получает сигнал OOM при достаточном объеме памяти?

Полезное

Проверить использование памяти
Увеличить лимит памяти через docker run
Настроить своп-память
Оптимизировать приложение внутри контейнера
Настроить OOM-адвоката
Перезапустить контейнеры и проверить логи