TGTGInsightаналитика telegramLIVE / telegram public index
← DevOps
DevOps avatar

TGINSIGHT POST

Post #1478

@DevOPSitsec

DevOps

Просмотры4,630Количество просмотров
Опубликован6 мая06.05.2025, 10:35
Содержимое поста

Содержимое

🐳 Как устроен Docker: что происходит «под капотом» Поговорим немного про базу. Docker — одно из самых популярных средств контейнеризации. Его простота снаружи скрывает сложную архитектуру. Разберём, как он устроен внутри. 1) Что такое контейнер? Контейнер — изолированная среда, где запускается приложение со всеми зависимостями. ⚠️ Это не виртуальная машина: контейнер делит ядро ОС с хостом, но видит только свою «песочницу» через изоляцию. 2) Основные компоненты • Docker Engine – Docker Daemon (`dockerd`) управляет контейнерами, образами, сетями – Docker CLI (`docker`) — интерфейс пользователя – REST API — взаимодействие CLI и Daemon 👉 Пример: docker run nginx → CLI отправляет запрос, Daemon находит образ, создаёт контейнер, запускает процесс. 3) Namespaces Механизм изоляции в Linux, создающий для контейнера: • свой процессный ID (pid namespace) • файловую систему (mnt namespace) • сеть (net namespace) • hostname (uts namespace) • IPC (ipc namespace) 👉 Благодаря namespace контейнер видит «свою» мини-ОС, хотя на деле — это лишь виртуальные границы. 4) Cgroups Ограничивают и учитывают ресурсы (CPU, RAM, I/O, сеть). Пример: можно задать лимит 512 МБ RAM и 0.5 CPU. Если приложение превышает лимит — Docker его ограничит или остановит. 5) Union File Systems (OverlayFS) Docker использует многослойную файловую систему. Каждый шаг Dockerfile создаёт новый слой. При запуске контейнера создаётся верхний writable-слой, остальные read-only. 👉 10 контейнеров на одном образе разделяют слои → экономия места. 6) Container Runtime Docker использует runc для запуска контейнера (соответствует OCI Runtime Spec). Daemon вызывает runc, который через clone(), setns(), chroot() изолирует процесс. 7) Docker Images Образ — read-only слои, собранные в Union FS. Каждый слой — изменения относительно предыдущего (например, установка пакета → новый слой). Хранение: локально (`/var/lib/docker`) или в реестре (Docker Hub, GitLab Container Registry). 8) Docker Networking Docker создаёт виртуальные сети (bridge, overlay, host). По умолчанию контейнеры подключаются к bridge и получают IP из внутреннего пула. 👉 Можно пробросить порты через -p, создать собственные сети, объединять контейнеры через docker network connect. В Swarm используется Overlay network (сеть между хостами). 9) Безопасность Docker использует: • seccomp (ограничение системных вызовов) • AppArmor / SELinux (контроль привилегий) • user namespaces (отображение UID контейнера в другой UID хоста) ⚠️ По умолчанию контейнеры имеют широкий доступ (например, /proc виден). Для production стоит ограничивать права (например, `--cap-drop`). 10) Что происходит при `docker run nginx`? 1. CLI отправляет запрос через API 2. Daemon ищет образ (локально или в registry) 3. Создаётся read-write слой контейнера 4. Создаются namespace (pid, net, mnt…) 5. Применяются cgroups 6. Вызывается runc для изоляции процесса 7. Контейнер подключается к сети 8. Запускается ENTRYPOINT/command Контейнер живёт, пока жив его процесс. 11) Почему Docker — не магия? Docker использует стандартные возможности ядра Linux (namespaces, cgroups, chroot, seccomp, overlayfs), оборачивая их в удобный интерфейс. Контейнер — просто изолированный процесс, а не полноценная VM. Поэтому Docker лёгкий, быстрый, удобный. 12) Заключение Под капотом Docker: • namespaces — изоляция • cgroups — контроль ресурсов • runc — запуск • overlayfs — многослойная ФС • REST API + Daemon + CLI — взаимодействие Docker скрывает сложность, давая простой инструмент для запуска, сборки, развёртывания приложений. Теперь, зная внутреннее устройство, можно глубже понять контейнеры, лучше их настраивать и оптимизировать. ➡️Подробнее @DevopsDocker