Ответ
Разница заключается в уровне доступа контейнера к хостовой системе, что напрямую влияет на безопасность.
Непривилегированный контейнер (режим по умолчанию):
- Запускается от непривилегированного пользователя (обычно UID 1000+).
- Имеет ограниченный набор capabilities (прав ядра Linux), например, не может монтировать устройства или изменять системные настройки сети.
- Изолирован namespaces (PID, сеть, пользователи и т.д.).
Привилегированный контейнер (флаг --privileged):
- Получает все capabilities ядра Linux.
- Снимает многие ограничения namespaces (например, контейнер может видеть все устройства хоста
/dev). - Фактически работает с правами root на хосте, что представляет серьезную угрозу безопасности.
Пример запуска:
# Опасный запуск с полными правами (избегать в продакшене)
docker run --privileged -it ubuntu bash
# Безопасная альтернатива: добавление только необходимых прав
# Например, для отладки сети нужен доступ к RAW-сокетам:
docker run --cap-add=NET_RAW --cap-add=NET_ADMIN -it nicolaka/netshoot
Best practice в DevOps:
- Всегда запускать контейнеры непривилегированными.
- Если приложению нужны особые права, использовать флаг
--cap-addдля добавления конкретных capabilities (например,NET_ADMIN,SYS_TIME). - В CI/CD-пайплайнах и оркестраторах (Kubernetes) явно запрещать привилегированные контейнеры через политики безопасности.