Введение / Зачем это нужно
Настройка лимитов памяти в Docker позволяет контролировать потребление ресурсов, предотвращать перегрузку хоста и обеспечивать стабильную работу приложений в контейнерах. С помощью лимитов вы можете гарантировать, что каждый контейнер будет использовать только allotted объем оперативной памяти, что особенно важно в общей среде с несколькими контейнерами.
Требования / Подготовка
- ОС: Ubuntu 22.04 (или Debian 12)
- Docker версии 23.04 или выше
- Права администратора (
sudo) для установки пакетов и запуска контейнеров - Базовое понимание команд Docker (
docker run,docker-compose)
Шаг 1: Установка Docker (если не установлен)
Если Docker уже установлен, пропустите этот шаг.
# Обновите список пакетов
sudo apt update
# Установите необходимые зависимости
sudo apt install -y ca-certificates curl gnupg
# Добавьте официальный ключ репозитория Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Добавьте репозиторий Docker в apt
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Установите Docker Engine, клиент и compose plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# (Опционально) добавьте текущего пользователя в группу docker
sudo usermod -aG docker $USER
💡 Совет: После добавления в группу перезагрузите терминал или выполните
newgrp docker, чтобы начать использовать Docker безsudo.
Шаг 2: Запуск контейнера с жёстким лимитом памяти
При запуске контейнера укажите --memory, чтобы ограничить объём используемой оперативной памяти.
docker run --name test-mem \
--memory=512m \
-d \
alpine:3.18 \
sleep 3600
--memory=512mустанавливает жёсткий лимит в 512 МБ.--memory-swap=512m(опционально) запрещает использование свопа, обеспечивая строгий контроль.
⚠️ Важно: Лимит применяется к одному контейнеру; превышение может вызвать
OOMKilledи перезапуск контейнера.
Шаг 3: Проверка лимитов с помощью docker stats
Чтобы убедиться, что лимит работает, используйте docker stats.
docker stats test-mem
Столбец MEM показывает:
- В использовании — текущее потребление памяти.
- Лимит — установленный предел (например,
512 MiB).
Вы также можете получить данные в формате JSON для скриптов:
docker stats --no-stream --format "{{json .}}" test-mem
Шаг 4: Настройка лимитов через docker-compose.yml
Для многоконтейнерных приложений удобнее использовать Docker Compose.
Добавьте конфигурацию в сервис:
version: "3.9"
services:
web:
image: nginx:1.23
mem_limit: 256m # жёсткий лимит
mem_reservation: 128m # безопасный порог
mem_swappiness: 60 # своп (опционально)
Затем выполните:
docker compose up -d
Compose применит лимиты при запуске контейнера.
Шаг 5: Регулировка резервирования и свопа
--memory-reservation(илиmem_reservation) — порог, при котором Docker начинает убивать процессы, если память превысила этот уровень.--memory-swap(илиmem_swap) — включает своп; установите его равным лимиту, чтобы запретить использование свопа.
Пример запуска с резервированием и без свопа:
docker run --name reserved-mem \
--memory=1g \
--memory-reservation=256m \
--memory-swap=0 \
-d \
alpine:3.18 \
sleep 3600
💡 Совет: Используйте
--memory-swapдля предотвращения использования свопа, что улучшает предсказуемость производительности.
Шаг 6: Устранение распространённых проблем
Проблема 1: Контейнер часто перезапускается из-за OOMKilled
- Проверьте логи:
docker logs test-mem - Увеличьте
--memoryили--memory-swap, чтобы освободить место. - Оптимизируйте приложение или ограничьте количество одновременно работающих процессов.
Проблема 2: docker stats не показывает лимит
- Убедитесь, что контейнер запущен (
docker ps). - Удалите и пересоздайте контейнер с лимитом, если предыдущий был запущен без него.
Проблема 3: Хост испытывает нехватку памяти
- Проверьте общее использование памяти хоста:
free -h. - Настройте лимиты для других контейнеров или ограничьте количество simultaneously работающих контейнеров.
Проверка результата
- Убедитесь, что контейнер работает:
docker ps. - Проверьте текущий лимит:
docker stats <container_name>. - При необходимости проверьте логи на OOMKilled:
docker logs <container_name>. - Для Compose проверьте логи сервиса:
docker compose logs web.
Если лимит отображается и контейнер стабилен, настройка успешно завершена.
Возможные проблемы
- Превышение лимита может вызвать
OOMKilled— увеличьте лимит или оптимизируйте приложение. - Неправильная синтаксисная ошибка при добавлении
mem_limitв Compose — убедитесь, что используете правильный ключ (mem_limitдля старых версий,deploy.resources.limits.memoryдля newer). - Недостаток прав для установки Docker — убедитесь, что вы добавили пользователя в группу
dockerи перезагрузили сессию.
Следуйте этим шагам, и вы сможете надёжно контролировать потребление памяти Docker в Linux-среде.