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

Какие инструменты ядра Linux используются для работы Docker

2.0 Middle🔥 201 комментариев
#Docker, Kubernetes и DevOps

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Ядра Linux, используемые Docker

Docker — это контейнеризационная платформа, которая использует несколько ключевых технологий ядра Linux для создания и управления изолированными окружениями приложений. Понимание этих инструментов важно для разработчика, работающего с контейнерами и микросервисной архитектурой.

Основные компоненты ядра Linux

1. Namespaces (Пространства имён)

Namespaces обеспечивают логическую изоляцию ресурсов между контейнерами:

  • PID Namespace — изоляция процессов

    docker run --pid=host ubuntu ps aux  # Общее пространство PID
    docker run ubuntu ps aux              # Изолированное PID
    

    Каждый контейнер видит только свои процессы, с PID начиная с 1

  • Network Namespace — изоляция сетевого стека

    • Отдельные IP адреса, маршруты, firewall правила
    • Позволяет контейнерам иметь свой виртуальный сетевой интерфейс
  • IPC Namespace — изоляция межпроцессного взаимодействия

    • Отдельные очереди сообщений, семафоры, разделяемая память
  • UTS Namespace — изоляция имена хоста и домена

    docker run --hostname myapp ubuntu hostname  # Вернёт "myapp"
    
  • Mount Namespace — изоляция точек монтирования файловых систем

    • Каждый контейнер имеет свою корневую файловую систему
    • Контейнер не видит точки монтирования хоста
  • User Namespace — изоляция UID/GID

    docker run --userns-remap=default ubuntu  # Переотображение пользователей
    

2. Cgroups (Control Groups)

Cgroups управляют и ограничивают ресурсы контейнеров:

# Ограничение памяти до 512MB
docker run -m 512m ubuntu

# Ограничение CPU (50% от одного ядра)
docker run --cpus="0.5" ubuntu

# Ограничение I/O
docker run --blkio-weight=100 ubuntu

Уровни cgroups:

  • CPU shares — процентное распределение CPU
  • Memory limits — максимальный объём оперативной памяти
  • Block I/O — пропускная способность диска
  • Device access — доступ к устройствам
  • Freezer — приостановка/возобновление процессов

3. UnionFS (Union File System)

Обеспечивает многоуровневую файловую систему:

  • Слои (Layers) — каждый слой содержит только изменения
  • Copy-on-Write (CoW) — файлы копируются только при изменении
  • Экономия места — несколько контейнеров могут использовать один базовый образ
# Иерархия слоёв образа
docker image inspect ubuntu | grep -A 10 "Layers"

Варианты реализации:

  • AUFS (Advanced multi-layered unification filesystems)
  • Overlay2 (рекомендуется для современных систем)
  • Btrfs
  • Device Mapper

4. Capabilities

Финальное разрешение/запрещение прав на уровне процесса:

# Удаление возможности изменения владельца файлов
docker run --cap-drop=CHOWN ubuntu

# Добавление специальных прав (опасно!)
docker run --cap-add=SYS_ADMIN ubuntu

# Запуск контейнера с минимальными правами
docker run --drop-cap=ALL ubuntu

Основные capabilities:

  • CAP_CHOWN — изменение владельца файлов
  • CAP_NET_BIND_SERVICE — привязка к портам < 1024
  • CAP_SYS_ADMIN — системные операции (опасно)
  • CAP_NET_RAW — использование сырых сокетов

5. seccomp (Secure Computing)

Огранничает системные вызовы доступные контейнеру:

# Использование профиля seccomp
docker run --security-opt seccomp=unconfined ubuntu

Как Docker использует эти инструменты

┌─────────────────────────────────────┐
│  Приложение в контейнере            │
├─────────────────────────────────────┤
│  Namespaces (PID, Network, IPC)     │ ← Изоляция процессов и ресурсов
├─────────────────────────────────────┤
│  Cgroups                            │ ← Ограничение ресурсов (CPU, память)
├─────────────────────────────────────┤
│  UnionFS (Overlay2)                 │ ← Многоуровневая FS
├─────────────────────────────────────┤
│  Capabilities & seccomp             │ ← Безопасность
├─────────────────────────────────────┤
│  Ядро Linux (kernel)                │
└─────────────────────────────────────┘

Пример использования

// Java приложение в Docker контейнере
public class DockerAwareApp {
    public static void main(String[] args) {
        // PID Namespace: PID этого процесса = 1 в контейнере
        System.out.println("PID: " + ProcessHandle.current().pid());
        
        // Cgroups: максимум памяти ограничен
        Runtime runtime = Runtime.getRuntime();
        long maxMemory = runtime.maxMemory();
        System.out.println("Max memory: " + maxMemory);
        
        // Network Namespace: видны только контейнерские интерфейсы
        // Mount Namespace: корень - это образ контейнера
    }
}

Проверка включённых инструментов

# Проверка поддержки namespaces
uname -r  # версия ядра (нужна 3.8+)

# Проверка cgroups
ls /sys/fs/cgroup/

# Проверка поддержки Docker
docker info  # показывает параметры безопасности

Почему это важно для Java Developer

  1. Отладка — понимание, как контейнер ограничивает ресурсы, помогает объяснить медленную работу приложения
  2. Конфигурация — правильный выбор лимитов памяти и CPU
  3. Безопасность — запуск контейнера с минимальными привилегиями
  4. Performance — оптимизация работы приложения в контейнере
  5. Troubleshooting — диагностика проблем с ресурсами

Все эти механизмы работают вместе, обеспечивая изоляцию, безопасность и управление ресурсами контейнеров, что делает Docker мощным инструментом для развёртывания приложений.

Какие инструменты ядра Linux используются для работы Docker | PrepBro