Что означает ошибка Docker OOM перезапуск
Контейнер Docker может быть перезапущен (код завершения работы 137), когда операционная система сигнализирует ядру Docker о нехватке памяти (Out‑Of‑Memory, OOM). Docker отмечает такой процесс как OOMKilled. Типичные логи содержат сообщение:
ОШИБКА: Контейнер ... был остановлен из-за нехватки памяти
Эта ситуация возникает, когда реальное использование памяти контейнера превышает установленный им лимит (--memory), и хост не может выделить дополнительную память без риска краха всей системы.
Причины возникновения
- Недостаточный лимит памяти в команде запуска (
--memory,mem_limitвdocker‑compose.yml). - Высокое потребление памяти самим приложением или собранными зависимостями.
- Отсутствие свопа на хосте, из-за чего ядро убивает процесс при исчерпании физической памяти.
- Конкуренция ресурсов на хосте: другие контейнеры или системы также используют основную память.
Способы решения
Способ 1: Увеличить лимит памяти
- Редактируйте
docker‑compose.yml(или команду запуска) и добавьте лимит:services: app: image: myapp mem_limit: 2g # или memory: "2g" - Перестройте и запустите сервис:
docker-compose down docker-compose up -d - Проверьте новый лимит:
docker inspect <container> | grep MemoryLimit
Способ 2: Обновить лимит для работающего контейнера
Если контейнер уже запущен, вы можете изменить лимит памяти без пересоздания:
docker update --memory=2g <container>
💡 Совет: После изменения лимита выполните
docker restart <container>для немедленного применения (если контейнер не перезапускается автоматически).
Способ 3: Оптимизировать приложение
- Оптимизируйте код – используйте эффективные алгоритмы, закэшируйте часто используемые данные.
- Настройте пулы соединений и ограничите размер кэшей баз данных.
- Перезапустите контейнер после изменений:
docker restart <container>
Способ 4: Добавить своп-память (временный вариант)
⚠️ Важно: Использование свопа снижает производительность, используйте только в крайнем случае.
- Добавьте своп-раздел или файл на хосте:
fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab - Настройте
vm.swappinessдля контроля использования свопа:sysctl vm.swappiness=10
Профилактика
- Мониторьте потребление с помощью
docker statsи визуализируйте графики в Grafana или Prometheus. - Установите алерты при превышении 80 % от лимита памяти.
- Используйте образы с минимальным размером и удаляйте ненужные зависимости.
- Настройте резервную память (
--memory-swap) для предотвращения внезапных перезапусков. - Регулярно обновляйте Docker и драйверы хоста для исправлений, связанных с обработкой памяти.
Соблюдая эти рекомендации, вы снизите вероятность возникновения OOM-ситуаций и стабилизируете работу контейнеров Docker.