Контейнер — лёгкая форма виртуализации на уровне ОС. В отличие от виртуальных машин, контейнеры не имеют собственного ядра — они используют ядро хост-системы, но изолированы через механизмы Linux: namespaces (пространства имён) и cgroups (контрольные группы). Контейнер запускается за 0,1–1 секунду и занимает 5–100 МБ против 30–90 секунд и 200–1000 МБ для VM.
Как работает контейнер
Linux предоставляет несколько типов namespaces: pid (изоляция процессов), net (сетевой стек), mnt (точки монтирования), uts (имя хоста), ipc (IPC-примитивы), user (UID/GID-маппинг). Каждый контейнер получает свои пространства имён — его процессы, сетевые интерфейсы и файловая система невидимы снаружи.
cgroups (контрольные группы) ограничивают ресурсы: CPU (максимальный % использования), RAM (hard limit, при превышении — OOM kill), блочный I/O (iops/bps limit), сеть. Docker управляет и namespaces, и cgroups автоматически при запуске контейнера через docker run.
Виды контейнеров
- Системные контейнеры (LXC/LXD, OpenVZ) — эмулируют полноценную ОС с init-системой, cron, SSH. Аналог VM, но без отдельного ядра.
- Контейнеры приложений (Docker, containerd) — один процесс на контейнер, иммутабельный образ, stateless-архитектура.
- Pod (Kubernetes) — группа контейнеров с общим сетевым пространством и хранилищем.
История контейнеров
Изоляция процессов через chroot появилась в UNIX в 1979 году. FreeBSD Jails (2000) — первая полноценная контейнерная система. Solaris Zones (2004) — контейнеры для Solaris. Linux-specific LXC (Linux Containers) появился в 2008 году с объединением cgroups (Google, 2007) и namespaces в ядре. Docker (2013, Solomon Hykes, dotCloud) революционизировал работу с контейнерами: стандартизированный формат образов, реестр Docker Hub, простой CLI. Kubernetes (2014, Google) добавил оркестрацию контейнеров на кластерах.
Контейнер vs виртуальная машина
| Параметр | Контейнер | Виртуальная машина |
|---|---|---|
| Изоляция ядра | Общее ядро хоста | Отдельное ядро каждой VM |
| Время запуска | 0,1–1 сек | 30–90 сек |
| Размер образа | 5–500 МБ | 1–50 ГБ |
| Overhead | 1–3% | 5–15% |
| Безопасность изоляции | Ниже (общее ядро) | Выше (hypervisor) |
Безопасность контейнеров
Общее ядро — главное ограничение безопасности контейнеров: уязвимость kernel escape позволяет выбраться из контейнера на хост. Меры защиты: Seccomp (фильтр системных вызовов, Docker применяет по умолчанию), AppArmor/SELinux-профили, rootless containers (контейнер работает без root-прав на хосте), read-only файловые системы для контейнеров. Kata Containers — каждый контейнер запускается в lightweight VM с отдельным ядром, сочетая безопасность VM и скорость контейнеров. Docker --cap-drop ALL снимает все Linux capabilities — принцип наименьших привилегий.
Контейнеры и оркестрация
Kubernetes — де-факто стандарт для запуска контейнеров в production: автоматический scheduling (размещение контейнеров на узлах), self-healing (перезапуск упавших), autoscaling (HPA, VPA, Cluster Autoscaler), service discovery и load balancing через kube-proxy. Docker Compose — для разработки и небольших инсталляций: docker-compose up -d запускает несколько контейнеров со связями и volumes. Podman — rootless-альтернатива Docker от Red Hat, не требует демона с root-правами, drop-in replacement для большинства случаев.