Ответ
Ограничение ресурсов контейнера — ключевая практика для стабильности хоста. В 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, что сложнее диагностировать.