← Назад к вопросам

Что изолируется в контейнере кроме файлов

2.0 Middle🔥 141 комментариев
#Docker и контейнеризация#Linux и администрирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Изоляция в контейнерах: не только файлы

Принято считать, что контейнер изолирует прежде всего файловую систему, но это лишь один из многих аспектов. Современные контейнерные технологии, такие как Docker и containerd, используют возможности ядра Linux (namespaces и cgroups) для создания комплексной изоляции, затрагивающей практически все ресурсы ОС. Давайте подробно рассмотрим, что именно изолируется.

1. Пространства имён (Namespaces) — основа изоляции

Каждый контейнер работает в собственном наборе namespace, который создаёт видимость выделенных глобальных ресурсов.

  • PID namespace (Process ID): Контейнер видит только свои собственные процессы. Процесс с PID 1 внутри контейнера — это, как правило, главный процесс (например, nginx), в то время как на хосте ему присвоен совершенно другой PID. Это предотвращает вмешательство в процессы хоста или других контейнеров.

    # Внутри контейнера мы видим изолированное дерево процессов
    docker run -it alpine ps aux
    PID   USER     TIME  COMMAND
        1 root      0:00 ps aux
    
  • Network namespace: Каждый контейнер получает собственную сетевую стеку: свой набор сетевых интерфейсов (например, eth0), таблицу маршрутизации, правила iptables (firewall) и сокеты. Это позволяет контейнерам иметь разные IP-адреса, слушать одни и те же порты (например, 80) независимо и не конфликтовать.

    # Создаётся виртуальный сетевой интерфейс для контейнера (veth pair)
    ip link show type veth
    
  • Mount namespace (mnt): Это и есть та самая "файловая" изоляция. Контейнер имеет собственное дерево монтирования. Он видит только те точки монтирования, которые были явно заданы при его создании (образ + volume/bind mounts). Файловая система хоста для него невидима, если не смонтирована явно.

  • UTS namespace (Unix Time Sharing): Изолирует системные идентификаторы hostname и domainname. Контейнер может иметь свой собственный hostname, отличный от хостового.

    docker run -it --hostname my-container alpine hostname
    # Вывод: my-container
    
  • IPC namespace (Inter-Process Communication): Изолирует ресурсы межпроцессного взаимодействия, такие как сегменты разделяемой памяти (shared memory), очереди сообщений и семафоры. Контейнеры не могут взаимодействовать через SysV IPC или POSIX-очереди с процессами за своими пределами.

  • User namespace (пользовательский): Более продвинутая изоляция, которая позволяет сопоставлять UID/GID внутри контейнера с другими (обычно непривилегированными) UID/GID на хосте. Например, процесс, работающий от root (UID 0) внутри контейнера, может быть отображён на непривилегированного пользователя (например, UID 1000) на хосте. Это критически важно для безопасности, так как минимизирует ущерб в случае побега из контейнера (container breakout).

2. Группы управления (Control Groups - cgroups) — изоляция и ограничение ресурсов

В то время как namespaces обеспечивают виртуализацию и разделение представлений, cgroups отвечают за ограничение, учёт и изоляцию физического использования ресурсов.

  • Ограничение ресурсов: Можно установить жёсткие лимиты.
    *   **CPU**: Ограничить долю использования CPU (`cpu.shares`) или абсолютное время (`cpu.cfs_quota_us`).
    *   **Память (memory)**: Установить лимит на использование ОЗУ и подкачки (`memory.limit_in_bytes`).
    *   **Ввод-Вывод (blkio)**: Ограничить скорость чтения/записи на диске.
    *   **Сеть**: С помощью внешних инструментов, таких как `tc` (traffic control), можно ограничивать сетевую полосу пропускания для сетевого интерфейса контейнера.

```dockerfile
# Пример в Docker run
docker run -it --cpus="0.5" --memory="512m" --memory-swap="1g" alpine
```
  • Учёт ресурсов: cgroups позволяет точно измерять, сколько CPU, памяти, сетевого I/O и дискового I/O использует конкретный контейнер, что является основой для мониторинга и биллинга.

  • Приоритизация: Можно задать приоритет доступа к ресурсам (например, дисковому I/O) для разных контейнеров.

3. Дополнительные аспекты изоляции

  • Изоляция времени и часовых поясов: Хотя напрямую не изолируется namespace, контейнер может иметь свои собственные настройки временной зоны (/etc/timezone, /etc/localtime), смонтированные извне или заданные в образе.

  • Изоляция переменных окружения (Environment Variables): Набор переменных окружения (env) уникален для каждого контейнера и задаётся при его создании. Они не видны другим контейнерам или хосту.

  • Псевдоизоляция ядра (Kernel): Это важнейшее ограничение контейнеров. В отличие от виртуальных машин, контейнеры делят одно и то же ядро хоста. Они изолированы друг от друга, но не изолированы от ядра. Это означает, что уязвимость в ядре может затронуть все контейнеры. С другой стороны, это делает контейнеры невероятно легковесными и быстрыми.

Итог

Контейнер — это не просто "легкая ВМ" или изолированная папка с файлами. Это комплексная среда, которая предоставляет:

  • Виртуальное представление системных ресурсов через namespaces (процессы, сеть, файлы, пользователи и т.д.).
  • Жёсткое ограничение и контроль за реальным потреблением физических ресурсов через cgroups (CPU, память, I/O).
  • Безопасную среду выполнения, которая, однако, не обеспечивает полной изоляции на уровне ядра.

Эта двухуровневая модель (namespaces + cgroups) является тем фундаментом, который сделал контейнеры такими эффективными, портабельными и пригодными для микросевисной архитектуры и практик DevOps.