Linux 137Высокая

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

Статья объясняет, почему Docker контейнеры перезапускаются при исчерпании памяти (OOM), и показывает несколько проверенных способов решить проблему. Вы узнаете, как настроить лимиты памяти, оптимизировать контейнеры и предотвратить будущие перезапуски.

Обновлено 8 августа 2026 г.
5-10 мин
Средняя
FixPedia Team
Применимо к:Docker Engine 20.10–24.04Ubuntu 22.04 LTSCentOS 8 Stream

Что означает ошибка Docker OOM перезапуск

Контейнер Docker может быть перезапущен (код завершения работы 137), когда операционная система сигнализирует ядру Docker о нехватке памяти (Out‑Of‑Memory, OOM). Docker отмечает такой процесс как OOMKilled. Типичные логи содержат сообщение:

ОШИБКА: Контейнер ... был остановлен из-за нехватки памяти

Эта ситуация возникает, когда реальное использование памяти контейнера превышает установленный им лимит (--memory), и хост не может выделить дополнительную память без риска краха всей системы.

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

  • Недостаточный лимит памяти в команде запуска (--memory, mem_limit в docker‑compose.yml).
  • Высокое потребление памяти самим приложением или собранными зависимостями.
  • Отсутствие свопа на хосте, из-за чего ядро убивает процесс при исчерпании физической памяти.
  • Конкуренция ресурсов на хосте: другие контейнеры или системы также используют основную память.

Способы решения

Способ 1: Увеличить лимит памяти

  1. Редактируйте docker‑compose.yml (или команду запуска) и добавьте лимит:
    services:
      app:
        image: myapp
        mem_limit: 2g   # или memory: "2g"
    
  2. Перестройте и запустите сервис:
    docker-compose down
    docker-compose up -d
    
  3. Проверьте новый лимит:
    docker inspect <container> | grep MemoryLimit
    

Способ 2: Обновить лимит для работающего контейнера

Если контейнер уже запущен, вы можете изменить лимит памяти без пересоздания:

docker update --memory=2g <container>

💡 Совет: После изменения лимита выполните docker restart <container> для немедленного применения (если контейнер не перезапускается автоматически).

Способ 3: Оптимизировать приложение

  1. Оптимизируйте код – используйте эффективные алгоритмы, закэшируйте часто используемые данные.
  2. Настройте пулы соединений и ограничите размер кэшей баз данных.
  3. Перезапустите контейнер после изменений:
    docker restart <container>
    

Способ 4: Добавить своп-память (временный вариант)

⚠️ Важно: Использование свопа снижает производительность, используйте только в крайнем случае.

  1. Добавьте своп-раздел или файл на хосте:
    fallocate -l 2G /swapfile
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    echo '/swapfile none swap sw 0 0' >> /etc/fstab
    
  2. Настройте vm.swappiness для контроля использования свопа:
    sysctl vm.swappiness=10
    

Профилактика

  • Мониторьте потребление с помощью docker stats и визуализируйте графики в Grafana или Prometheus.
  • Установите алерты при превышении 80 % от лимита памяти.
  • Используйте образы с минимальным размером и удаляйте ненужные зависимости.
  • Настройте резервную память (--memory-swap) для предотвращения внезапных перезапусков.
  • Регулярно обновляйте Docker и драйверы хоста для исправлений, связанных с обработкой памяти.

Соблюдая эти рекомендации, вы снизите вероятность возникновения OOM-ситуаций и стабилизируете работу контейнеров Docker.

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

Почему контейнер Docker перезапускается из-за OOM?
Как проверить, что перезапуск вызван нехваткой памяти?
Как увеличить лимит памяти для контейнера?
Как предотвратить будущие OOM-ситуации?

Полезное

Проверить текущий лимит памяти
Увеличить лимит памяти
Обновить лимит для работающего контейнера
Оптимизировать приложение
Добавить своп-память (временный вариант)
Проверить логи после изменений

Эта статья помогла вам решить проблему?