Как ограничить ресурсы контейнера Docker?

«Как ограничить ресурсы контейнера Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Ограничение ресурсов контейнера — ключевая практика для стабильности хоста. В Docker это делается через флаги командной строки или настройки в Docker Compose.

Основные флаги docker run:

docker run -d 
  --name my-app 
  --memory="512m"                # Лимит оперативной памяти
  --memory-swap="1g"             # Общий лимит (RAM + Swap). Значение '-1' отключает swap.
  --cpus="1.5"                   # Доступное количество ядер CPU
  --cpuset-cpus="0,1"            # Привязка к конкретным ядрам CPU (0 и 1)
  --cpu-shares=512               # Относительный вес при конкуренции за CPU (по умолчанию 1024)
  --blkio-weight=500             # Вес для операций ввода-вывода блочных устройств
  --ulimit nofile=1024:2048     # Лимит на число открытых файлов (мягкий:жесткий)
  nginx:alpine

Конфигурация в docker-compose.yml:

services:
  application:
    image: myapp:latest
    deploy:
      resources:
        limits:
          cpus: '0.75'
          memory: 256M
        reservations:
          cpus: '0.25'
          memory: 128M

Почему это важно:

  • --memory и --cpus предотвращают ситуацию, когда один контейнер исчерпывает все ресурсы хоста, вызывая деградацию или падение других сервисов.
  • --memory-swap требует внимания: если установить --memory=500m и --memory-swap=1g, то контейнеру будет доступно ~500M RAM и ~500M swap.
  • На практике я всегда задаю лимиты, особенно для памяти. Без этого контейнер может быть убит системным OOM-killer, что сложнее диагностировать.