← Назад к вопросам
Какие утилиты работают под капотом у 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
| Функция | Утилита/Компонент | Назначение |
|---|---|---|
| Управление контейнерами | containerd | High-level container management |
| Запуск контейнера | runc | Low-level container execution |
| Изоляция процессов | Namespaces (PID, Network, Mount) | Процессы видят только свои |
| Ограничение ресурсов | cgroups | Memory, CPU, I/O limits |
| Пробрасывание портов | iptables/netfilter | NAT и firewall rules |
| Сетевые интерфейсы | ip, bridge-utils | veth пары, docker0 bridge |
| Слои образа | overlayfs/aufs | Copy-on-write file system |
| Смена корневой FS | pivot_root/chroot | Изолированная FS для контейнера |
| Системное управление | systemd | Docker 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)
Ключевые утилиты:
- containerd — управление контейнерами
- runc — запуск контейнеров
- namespaces — изоляция (PID, Net, Mount, IPC, UTS, User)
- cgroups — ограничение ресурсов (Memory, CPU, I/O)
- overlayfs — эффективное хранилище слоёв
- iptables — пробрасывание портов через NAT
- mount — управление файловыми системами
Понимание этих компонентов критично для debugging контейнеров и оптимизации Docker конфигурации!