Linux

Полное руководство по установке лимитов памяти Docker на Ubuntu 22.04

В этой статье вы узнаете, как настроить лимиты памяти Docker на Linux, чтобы контролировать потребление ресурсов, предотвратить перегрузку и оптимизировать производительность контейнеров. После выполнения инструкции вы сможете устанавливать и проверять лимиты как через CLI, так и с помощью docker-compose.

Обновлено 9 июля 2026 г.
5-10 мин
Средняя
FixPedia Team
Применимо к:Docker 23.04Ubuntu 22.04Debian 12

Введение / Зачем это нужно

Настройка лимитов памяти в 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 работающих контейнеров.

Проверка результата

  1. Убедитесь, что контейнер работает: docker ps.
  2. Проверьте текущий лимит: docker stats <container_name>.
  3. При необходимости проверьте логи на OOMKilled: docker logs <container_name>.
  4. Для Compose проверьте логи сервиса: docker compose logs web.

Если лимит отображается и контейнер стабилен, настройка успешно завершена.

Возможные проблемы

  • Превышение лимита может вызвать OOMKilled — увеличьте лимит или оптимизируйте приложение.
  • Неправильная синтаксисная ошибка при добавлении mem_limit в Compose — убедитесь, что используете правильный ключ (mem_limit для старых версий, deploy.resources.limits.memory для newer).
  • Недостаток прав для установки Docker — убедитесь, что вы добавили пользователя в группу docker и перезагрузили сессию.

Следуйте этим шагам, и вы сможете надёжно контролировать потребление памяти Docker в Linux-среде.

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

Как установить лимит памяти для контейнера Docker?
Как проверить текущее использование памяти контейнером?
Что делать, если контейнер исчерпывает лимит памяти?
Как настроить лимиты памяти для docker-compose?

Полезное

Установка Docker (если не установлен)
Запуск контейнера с жёстким лимитом памяти
Проверка лимитов с помощью docker stats
Настройка лимитов через docker-compose.yml
Регулировка резервирования и свопа
Устранение распространённых проблем

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