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

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

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

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

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

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

Утилиты и технологии Linux под капотом Docker

Docker - это не монолитное приложение, а набор Linux технологий, которые работают вместе для обеспечения контейнеризации. Рассмотрим ключевые компоненты.

1. Namespaces (пространства имен)

Описание: Изоляция системных ресурсов контейнера от хоста и других контейнеров.

# Проверка namespaces контейнера
ls -la /proc/{PID}/ns/

# Типы namespaces:
# - PID: Изоляция процессов (контейнер думает, что он PID 1)
# - Network: Изоляция сетевых интерфейсов
# - Mount (mnt): Изоляция файловой системы
# - UTS: Изоляция hostname и domainname
# - IPC: Изоляция механизмов IPC (shared memory, semaphores)
# - User: Изоляция UIDs/GIDs
# - Cgroup: Изоляция контроля ресурсов

Python пример проверки namespaces:

import os
import subprocess

def get_container_namespaces(container_id):
    try:
        # Получить PID контейнера
        result = subprocess.run(
            ['docker', 'inspect', '-f', '{{.State.Pid}}', container_id],
            capture_output=True, text=True
        )
        pid = result.stdout.strip()
        
        # Получить информацию о namespaces
        ns_dir = f'/proc/{pid}/ns/'
        namespaces = os.listdir(ns_dir)
        return namespaces
    except Exception as e:
        print(f'Error: {e}')
        return None

Особенности:

  • PID namespace: контейнер видит только свои процессы
  • Network namespace: отдельный стек сети, IP адреса
  • Mount namespace: отдельная корневая файловая система
  • User namespace: UID/GID mappings

2. Cgroups (Control Groups)

Описание: Ограничение и контроль использования ресурсов.

# Просмотр cgroups контейнера
cat /proc/{PID}/cgroup

# Структура cgroups v1
/sys/fs/cgroup/memory/docker/{container_id}/memory.limit_in_bytes
/sys/fs/cgroup/cpu/docker/{container_id}/cpu.shares
/sys/fs/cgroup/blkio/docker/{container_id}/blkio.weight

# Cgroups v2 (новый формат)
/sys/fs/cgroup/docker.slice/{container_id}/memory.max

Python пример получения лимитов:

def get_container_memory_limit(container_id):
    try:
        with open(f'/sys/fs/cgroup/memory/docker/{container_id}/memory.limit_in_bytes', 'r') as f:
            limit_bytes = int(f.read().strip())
            limit_gb = limit_bytes / (1024 ** 3)
            return limit_gb
    except FileNotFoundError:
        # Попробуем cgroups v2
        with open(f'/sys/fs/cgroup/docker.slice/{container_id}/memory.max', 'r') as f:
            limit_bytes = int(f.read().strip())
            return limit_bytes / (1024 ** 3)
    except Exception as e:
        print(f'Error: {e}')
        return None

Типы ограничений:

  • Memory: memory.limit_in_bytes, memory.memsw.limit_in_bytes
  • CPU: cpu.shares, cpuset.cpus, cpu.cfs_period_us
  • Block I/O: blkio.weight, blkio.throttle.read_bps_device
  • Network: через tc (traffic control)

3. UnionFS (Union Filesystem)

Описание: Многоуровневая файловая система для слоев образа.

# Проверка driver Docker
docker info | grep "Storage Driver"

# Типы Union FS:
# - AUFS (Advanced multi-layered unification filesystem)
# - overlay2 (современный стандарт)
# - btrfs
# - zfs
# - devicemapper

# Просмотр слоев контейнера
ls -la /var/lib/docker/overlay2/{container_id}/

# Структура overlay2
# - lower: базовые слои из образа
# - merged: объединенная файловая система (что видит контейнер)
# - upper: изменения в контейнере
# - work: временное рабочее пространство

Python пример работы с слоями:

import json
import subprocess

def get_image_layers(image_id):
    try:
        result = subprocess.run(
            ['docker', 'history', '--no-trunc', image_id],
            capture_output=True, text=True
        )
        lines = result.stdout.split('\n')[1:-1]  # Skip header and empty line
        layers = []
        for line in lines:
            parts = line.split()
            layers.append({
                'id': parts[0],
                'size': parts[-1] if parts[-1] != '<missing>' else 'missing'
            })
        return layers
    except Exception as e:
        print(f'Error: {e}')
        return None

4. Capabilities (Linux Capabilities)

Описание: Детальное разделение прав вместо традиционного модели root/non-root.

# По умолчанию Docker контейнер запускается с ограниченными capabilities
CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_FOWNER, CAP_SETGID, CAP_SETUID,
CAP_SETFCAP, CAP_SETPCAP, CAP_NET_RAW, CAP_SYS_CHROOT, CAP_KILL,
CAP_AUDIT_WRITE

# Отключение capability
docker run --cap-drop=NET_BIND_SERVICE myimage

# Добавление capability (опасно!)
docker run --cap-add=SYS_ADMIN myimage

Python пример проверки capabilities:

def get_container_capabilities(container_id):
    try:
        result = subprocess.run(
            ['docker', 'inspect', container_id],
            capture_output=True, text=True
        )
        data = json.loads(result.stdout)[0]
        caps = data['HostConfig']['CapAdd']
        caps_dropped = data['HostConfig']['CapDrop']
        return {'added': caps, 'dropped': caps_dropped}
    except Exception as e:
        print(f'Error: {e}')
        return None

5. SELinux и AppArmor

Описание: Модули безопасности ОС для дополнительной изоляции.

# Проверка SELinux
getenforce

# Проверка AppArmor
aa-status

# Docker использует профили для ограничения действий контейнера
# AppArmor профиль по умолчанию: docker-default

Python пример:

import subprocess

def check_selinux_status():
    try:
        result = subprocess.run(['getenforce'], capture_output=True, text=True)
        return result.stdout.strip()
    except FileNotFoundError:
        return 'SELinux not available'

def check_apparmor_status():
    try:
        result = subprocess.run(['aa-status'], capture_output=True, text=True)
        return 'AppArmor enabled' if result.returncode == 0 else 'AppArmor disabled'
    except FileNotFoundError:
        return 'AppArmor not available'

6. Seccomp (Secure Computing Mode)

Описание: Фильтрация системных вызовов (syscalls) на уровне ядра.

# Docker использует профиль Seccomp по умолчанию
# Профиль находится в /etc/docker/seccomp.json

# Запуск контейнера без Seccomp (опасно!)
docker run --security-opt seccomp=unconfined myimage

# Использование пользовательского профиля
docker run --security-opt seccomp=/path/to/profile.json myimage

Python пример создания профиля Seccomp:

import json

# Примерный профиль Seccomp
seccomp_profile = {
    "defaultAction": "SCMP_ACT_ALLOW",
    "defaultErrnoRet": 1,
    "archMap": [
        {
            "architecture": "SCMP_ARCH_X86_64",
            "subArchitectures": []
        }
    ],
    "syscalls": [
        {
            "name": "clone",
            "action": "SCMP_ACT_ALLOW",
            "args": []
        },
        {
            "name": "mount",
            "action": "SCMP_ACT_ERRNO",
            "args": []
        }
    ]
}

with open('seccomp.json', 'w') as f:
    json.dump(seccomp_profile, f, indent=2)

7. iptables и netfilter

Описание: Фильтрация и маршрутизация сетевого трафика.

# Docker использует iptables для управления сетью контейнера
docker network create mynetwork

# Просмотр правил iptables для Docker
sudo iptables -L -t nat | grep docker

# Правила для проброса портов
sudo iptables -L -t nat -n | grep DNAT

Python пример анализа сетевых правил:

import subprocess
import re

def get_docker_port_mappings():
    try:
        result = subprocess.run(
            ['iptables', '-L', '-t', 'nat', '-n'],
            capture_output=True, text=True, check=True
        )
        
        mappings = []
        for line in result.stdout.split('\n'):
            if 'DNAT' in line and 'docker' in line:
                mappings.append(line.strip())
        return mappings
    except Exception as e:
        print(f'Error: {e}')
        return None

8. Copy-on-Write (CoW)

Описание: Оптимизация памяти при копировании данных.

# При создании контейнера слои не копируются
# Копирование происходит только при изменении файлов
# Это экономит память и дисковое пространство

Пример CoW в действии:

# Образ занимает 1GB
# Запущено 10 контейнеров - общая память ~1GB (а не 11GB)
# Каждый контейнер видит полную файловую систему
# Изменения локальны для каждого контейнера

9. libcontainer

Описание: Библиотека Docker для создания и управления контейнерами.

# libcontainer использует вышеупомянутые технологии
# Главная точка входа: go-runc (run container tool)

# Проверка версии containerd
containerd --version

# containerd - демон управления контейнерами
sudo systemctl status containerd

10. Volumes и Bind Mounts

Описание: Механизмы для монтирования файловых систем.

import subprocess
import json

# Создание volume
subprocess.run(['docker', 'volume', 'create', 'myvolume'])

# Использование volume в контейнере
def get_container_volumes(container_id):
    result = subprocess.run(
        ['docker', 'inspect', container_id],
        capture_output=True, text=True
    )
    data = json.loads(result.stdout)[0]
    mounts = data['Mounts']
    return mounts

# Пример вывода
# [
#   {
#     'Type': 'volume',
#     'Source': '/var/lib/docker/volumes/myvolume/_data',
#     'Destination': '/data',
#     'Mode': 'z'
#   }
# ]

Общая архитектура Docker

┌─────────────────────────────────────┐
│  Docker CLI / Docker API            │
├─────────────────────────────────────┤
│  Docker Daemon (dockerd)            │
│  ├─ Image Manager                   │
│  ├─ Container Manager (libcontainer)│
│  └─ Network Manager                 │
├─────────────────────────────────────┤
│  containerd (Container Runtime)     │
│  └─ runc (Low-level runtime)        │
├─────────────────────────────────────┤
│  Linux Kernel                       │
│  ├─ Namespaces (PID, Net, Mount)    │
│  ├─ Cgroups (Resource Control)      │
│  ├─ Capabilities (Permission Model) │
│  ├─ SELinux / AppArmor (MAC)        │
│  ├─ Seccomp (Syscall Filtering)     │
│  ├─ netfilter / iptables (Networking)
│  └─ UnionFS / overlay2 (Storage)    │
└─────────────────────────────────────┘

Сравнительная таблица технологий

ТехнологияНазначениеОбязательнаяПроизводительность
NamespacesИзоляция ресурсовДаМинимальный overhead
CgroupsОграничение ресурсовДаМинимальный overhead
UnionFSМногоуровневые слоиДаБыстро для read-only
CapabilitiesБезопасностьНетНулевой overhead
SELinux/AppArmorДополнительная безопасностьНетНебольшой overhead
SeccompФильтрация syscallsНетНебольший overhead
iptablesСетевая маршрутизацияДаНебольшой overhead
CoWЭкономия памятиДаСнижает использование памяти

Best Practices

  1. Ограничивай ресурсы контейнеров (CPU, memory limits)
  2. Используй read-only root filesystem где возможно
  3. Не запускай контейнер как root без необходимости
  4. Ограничь capabilities только необходимыми
  5. Используй секьюрные профили (Seccomp, AppArmor)
  6. Проверяй сетевые правила регулярно
  7. Мониторь использование ресурсов (cgroups)
  8. Используй private networks для контейнеров

Вывод: Docker - это элегантная комбинация зрелых Linux технологий. Глубокое понимание этих компонентов критично для работы с контейнерами на production уровне.