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

Какие утилиты работают под капотом у Docker?

2.0 Middle🔥 61 комментариев
#DevOps и инфраструктура

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

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

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

Какие утилиты работают под капотом у Docker?

Это важный вопрос для понимания того, как Docker работает на уровне ОС Linux. Docker — это не волшебство, а набор уже существующих Linux утилит.

Основные компоненты Docker

┌─────────────────────────────────────────────────────┐
│ Docker (High-level контейнеризация)                 │
│                                                     │
│  containerd (управление контейнерами)              │
│       ↓                                             │
│  runc (runtime для запуска контейнеров)             │
│       ↓                                             │
│  Linux Kernel Features (cgroups, namespaces)       │
└─────────────────────────────────────────────────────┘

1. containerd — основной runtime

Что это: Daemon, который управляет жизненным циклом контейнеров.

# containerd работает как отдельный process
ps aux | grep containerd
# /usr/bin/containerd

# Проверить статус
sudo systemctl status containerd

# Работать напрямую с containerd
ctr images ls      # Список образов
ctr run hello      # Запустить контейнер
ctr containers ls  # Список контейнеров

Функции:

  • Управление образами
  • Запуск контейнеров
  • Управление сетью контейнеров
  • Управление storage

2. runc — runtime для контейнеров

Что это: Low-level утилита, которая непосредственно запускает контейнер.

# runc — это бинарник на машине
which runc
# /usr/sbin/runc

runc --version
# runc version 1.1.5
commit: v1.1.5

# Сам по себе мало полезен, работает через containerd

Функции:

  • Создание namespaces
  • Установка cgroups
  • Запуск процесса в контейнере

3. Linux Kernel Features (критически важные)

Namespaces — изоляция ресурсов

# Namespace типы в Docker:

# 1. PID Namespace — изоляция процессов
ls -la /proc/[PID]/ns/
# lrwxrwxrwx 1 root root 0 Nov 15 10:30 pid -> 'pid:[4026531836]'

# Контейнер видит только свои процессы
docker exec mycontainer ps aux
# В контейнере PID 1, хотя на хосте может быть PID 12345

# 2. Network Namespace — изоляция сети
# Каждый контейнер имеет свой виртуальный сетевой интерфейс
ip netns list
# Показывает namespaces на хосте

# 3. Mount Namespace — изоляция файловой системы
# Контейнер видит другую корневую FS, хотя это на самом деле подпапка

# 4. IPC Namespace — межпроцессное взаимодействие
# Контейнер не видит shared memory от других контейнеров

# 5. UTS Namespace — hostname и domainname
# Контейнер может иметь свой hostname
docker run --hostname myhost ubuntu hostname
# myhost (хотя на хосте другой hostname)

# 6. User Namespace — изоляция пользователей
# Процесс может быть root в контейнере, но обычный пользователь на хосте

Control Groups (cgroups) — ограничение ресурсов

# cgroups ограничивают использование ресурсов

# 1. Memory cgroup — ограничение памяти
docker run -m 512m ubuntu  # Максимум 512MB памяти

# Проверить cgroups на хосте
ls /sys/fs/cgroup/
# cpu  cpuacct  cpuset  devices  freezer  memory  net_cls  ...

# 2. CPU cgroup — ограничение CPU
docker run --cpus="1.5" ubuntu  # Максимум 1.5 CPU

# 3. I/O cgroup — ограничение дискового I/O
docker run --blkio-weight=300 ubuntu

# Просмотр текущих ограничений
cat /sys/fs/cgroup/memory/docker/[container_id]/memory.limit_in_bytes
# 536870912 (512MB в байтах)

4. Основные утилиты Linux, используемые Docker

# 1. iptables — конфигурирование firewalla и NAT
sudo iptables -L -t nat
# Docker использует для пробрасывания портов (-p 8000:8000)
# Это всё через iptables!

# 2. ip — конфигурирование сети
sudo ip link show
# Docker создаёт виртуальные сетевые интерфейсы через эту утилиту
# docker0 — bridge интерфейс
# veth* — связь между хостом и контейнером

# 3. mount — монтирование файловых систем
mount | grep docker
# /dev/mapper/... on /var/lib/docker type ext4 (rw,relatime)
# Контейнеры используют overlayfs для efficient file layering

# 4. chroot/pivot_root — смена корневой FS
# Docker использует для создания изолированной FS в контейнере

# 5. systemd-cgroup — управление cgroups
systemctl status docker
# Docker daemon управляется через systemd

5. Layered Filesystem — оверлей для эффективности

# Docker использует overlayfs (или aufs на старых версиях)
ls -la /var/lib/docker/overlay2/
# Показывает слои образов

# Структура:
/var/lib/docker/overlay2/
├── [image_layer_1]/
│   ├── lower      # Слой от базового образа (read-only)
│   ├── merged     # Объединённое представление
│   └── work       # Рабочая директория
├── [image_layer_2]/
└── [container_layer]/
    ├── lower      # Все слои образа
    ├── upper      # Изменения контейнера (read-write)
    ├── merged     # Финальный вид
    └── work

# Преимущества overlayfs:
# - Экономия места (слои не дублируются)
# - Быстрая создание контейнеров (не нужно копировать все слои)
# - Эффективный copy-on-write

6. Storage Driver — система хранения

# Просмотр current storage driver
docker info | grep "Storage Driver"
# Storage Driver: overlay2

# Другие драйверы (ниже в приоритете):
# - overlayfs (лучший для modern Linux)
# - aufs (older Linux)
# - devicemapper (ограничено)
# - btrfs (специалист)
# - zfs (специалист)

# Каждый драйвер использует свои Linux утилиты!

7. Graphdriver — управление образами

# Docker хранит образы слоями
docker images
# REPOSITORY  TAG       IMAGE ID      SIZE
# ubuntu      latest    a8cc3f7...    77.8MB

# На диске это представлено как несколько слоёв
ls /var/lib/docker/[storage-driver]/
# Каждый layer = отдельная папка с файлами

# Docker стройит "графо" зависимостей слоёв
# Image = sequence of layers с метаданными

8. Полный поток Docker

┌─────────────────────────────────────────────────────┐
│ docker run -p 8000:8000 myapp                       │
└────────────┬────────────────────────────────────────┘
             │
             ▼
┌─────────────────────────────────────────────────────┐
│ Docker daemon получает команду                      │
│ (/var/run/docker.sock)                              │
└────────────┬────────────────────────────────────────┘
             │
             ▼
┌─────────────────────────────────────────────────────┐
│ containerd создаёт контейнер                        │
│ - Загружает образ (graphdriver)                     │
│ - Подготавливает overlayfs слои                     │
└────────────┬────────────────────────────────────────┘
             │
             ▼
┌─────────────────────────────────────────────────────┐
│ runc запускает контейнер                            │
│ - Создаёт namespaces (PID, Network, Mount, etc)   │
│ - Устанавливает cgroups (memory, CPU, I/O)         │
│ - Монтирует rootfs через pivot_root                 │
│ - Запускает init процесс (PID 1)                    │
└────────────┬────────────────────────────────────────┘
             │
             ▼
┌─────────────────────────────────────────────────────┐
│ Контейнер работает в изолированной среде            │
│ - iptables проксирует сетевой трафик               │
│ - overlayfs управляет файловой системой             │
│ - cgroups ограничивают ресурсы                      │
│ - namespaces обеспечивают изоляцию                  │
└─────────────────────────────────────────────────────┘

9. Практические команды для диагностики

# Просмотр того, что работает под капотом

# 1. Процессы Docker
ps aux | grep -E 'dockerd|containerd|runc'

# 2. Namespaces контейнера
ls -la /proc/[docker_pid]/ns/

# 3. cgroups контейнера
cat /proc/[docker_pid]/cgroup
# Shows cgroups path like: 11:cpuset:/docker/abc123...

# 4. Сетевые интерфейсы
ip link show
# docker0 — bridge для контейнеров
# veth* — virtual ethernet пары

# 5. iptables rules для Port mapping
sudo iptables -t nat -L -n | grep -i docker
# Показывает DNAT rules для пробрасывания портов

# 6. Mount points контейнера
mount | grep overlay
# /dev/mapper/... on /var/lib/docker/overlay2/.../merged

# 7. Файловая система контейнера
ls /var/lib/docker/overlay2/
# Слои образа и контейнера

10. Альтернативы Docker (используют те же утилиты)

# Podman — альтернатива Docker
# Использует те же утилиты (runc, cgroups, namespaces)
# Просто другая реализация daemon'а

podman run -p 8000:8000 myapp
# Под капотом тоже использует:
# - runc для запуска
# - overlayfs для слоёв
# - namespaces для изоляции
# - cgroups для ограничений

Итоговая таблица: Linux утилиты под капотом Docker

ФункцияУтилита/КомпонентНазначение
Управление контейнерамиcontainerdHigh-level container management
Запуск контейнераruncLow-level container execution
Изоляция процессовNamespaces (PID, Network, Mount)Процессы видят только свои
Ограничение ресурсовcgroupsMemory, CPU, I/O limits
Пробрасывание портовiptables/netfilterNAT и firewall rules
Сетевые интерфейсыip, bridge-utilsveth пары, docker0 bridge
Слои образаoverlayfs/aufsCopy-on-write file system
Смена корневой FSpivot_root/chrootИзолированная FS для контейнера
Системное управлениеsystemdDocker daemon as service

Вывод

Docker НЕ изобретает что-то новое — он использует стандартные Linux утилиты и создаёт удобный интерфейс:

Linux Kernel (Namespaces, cgroups, overlayfs)
         ↑
    runc (low-level)
         ↑
  containerd (mid-level)
         ↑
   Docker daemon (high-level user interface)
         ↑
   docker CLI (easy to use)

Ключевые утилиты:

  1. containerd — управление контейнерами
  2. runc — запуск контейнеров
  3. namespaces — изоляция (PID, Net, Mount, IPC, UTS, User)
  4. cgroups — ограничение ресурсов (Memory, CPU, I/O)
  5. overlayfs — эффективное хранилище слоёв
  6. iptables — пробрасывание портов через NAT
  7. mount — управление файловыми системами

Понимание этих компонентов критично для debugging контейнеров и оптимизации Docker конфигурации!

Какие утилиты работают под капотом у Docker? | PrepBro