Какие утилиты и технологии Linux используются под капотом Docker?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Утилиты и технологии 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
- Ограничивай ресурсы контейнеров (CPU, memory limits)
- Используй read-only root filesystem где возможно
- Не запускай контейнер как root без необходимости
- Ограничь capabilities только необходимыми
- Используй секьюрные профили (Seccomp, AppArmor)
- Проверяй сетевые правила регулярно
- Мониторь использование ресурсов (cgroups)
- Используй private networks для контейнеров
Вывод: Docker - это элегантная комбинация зрелых Linux технологий. Глубокое понимание этих компонентов критично для работы с контейнерами на production уровне.