DevOps
Контейнеры и виртуальные машины, Docker, оркестрация контейнеров и развёртывание C++ сервисов.
7 вопросов
JuniorТеорияОчень частоЧто делает Docker и в чём разница между образом и контейнером?
Что делает Docker и в чём разница между образом и контейнером?
Docker упаковывает приложение вместе с его зависимостями, библиотеками и точкой входа в неизменяемый образ (собираемый из Dockerfile). Запущенный экземпляр образа — это контейнер: изолированная группа процессов, разделяющая ядро хоста.
Типичные ошибки
- ✗Изменять файлы внутри запущенного контейнера, ожидая сохранения — изменения теряются при рестарте, если это не volume
- ✗Класть секреты или креды БД в образ — слои образа можно проинспектировать; никогда не кладите секреты в образ
- ✗Считать тег
latestстабильным — это движущийся указатель; в продакшене пиньте к неизменяемому digest
Уточняющие вопросы
- →Чем отличается Docker volume от bind mount?
- →Почему для компилируемых языков вроде C++ предпочитают multi-stage Dockerfile?
JuniorТеорияЧастоЧто такое менеджер пакетов? Примеры для Linux.
Что такое менеджер пакетов? Примеры для Linux.
Автоматизирует загрузку, установку, обновление и удаление ПО с зависимостями. Linux: apt (Debian/Ubuntu) — .deb; yum/dnf (RHEL/Fedora) — .rpm; pacman (Arch) — .pkg.tar.zst; snap/flatpak — sandbox-кроссдистрибутивные. Разработка: vcpkg, Conan (C++), pip, npm. Отслеживает версии, разрешает транзитивные зависимости автоматически.
Типичные ошибки
- ✗Запускать
apt upgradeна production-сервере без тестирования — новая версия библиотеки может нарушить ABI-совместимость с уже установленными бинарниками - ✗Смешивать менеджеры пакетов (например, apt и snap) для одного инструмента — параллельные установки с разными версиями вызывают путаницу в PATH
- ✗Устанавливать dev-библиотеки глобально вместо per-project — конфликтующие версии для разных проектов; используйте виртуальные окружения или контейнеры
Уточняющие вопросы
- →В чём разница между
apt installиapt-get install? - →Как
dpkgсоотносится сapt?
MiddleТеорияЧастоЧто такое контейнеризация, и чем Docker отличается от виртуальной машины?
Что такое контейнеризация, и чем Docker отличается от виртуальной машины?
Контейнеризация упаковывает приложение с зависимостями в изолированную единицу через namespaces и cgroups ядра. Контейнер разделяет ядро хоста — быстрый старт, маленькие образы — тогда как ВМ эмулирует полноценное «железо» со своим ядром. Docker — доминирующий инструмент.
Типичные ошибки
- ✗Запускать контейнеры от root — побег из ядра даёт атакующему root на хосте; задайте не-root
USERв Dockerfile - ✗Использовать тег
latestв production — он молча меняется с каждым push; фиксируйте digest или тег версии - ✗Запекать секреты в образ через
ENV— они видны вdocker inspectи слоях образа; передавайте через runtime-секреты
Уточняющие вопросы
- →Какие возможности ядра Linux (namespaces, cgroups, seccomp) делают изоляцию контейнеров возможной?
- →Как многоэтапные сборки Dockerfile уменьшают размер итогового образа для C++ сервисов?
MiddleТеорияЧастоЧто такое systemd и чем он отличается от SysV init?
Что такое systemd и чем он отличается от SysV init?
systemd — init большинства современных дистрибутивов (PID 1). В отличие от последовательных shell-скриптов SysV, стартует сервисы параллельно по графу зависимостей, поддерживает socket activation (lazy start), отслеживает через cgroups, использует унифицированные unit-файлы. Включает journald, networkd, timesyncd — всеобъемлющий, что и вызывает споры.
Типичные ошибки
- ✗Править
/lib/systemd/system/вместо/etc/systemd/system/— перезатрётся при обновлении - ✗Забыть
systemctl daemon-reloadпосле изменения unit-файла - ✗Смешивать
service,init.dиsystemctlбез понимания, что делает каждое
Уточняющие вопросы
- →Как
systemctl list-dependenciesпомогает дебажить стартовый порядок? - →Что такое socket activation и когда полезен?
JuniorТеорияИногдаКакие дистрибутивы Linux существуют и чем они отличаются?
Какие дистрибутивы Linux существуют и чем они отличаются?
Семьи: Debian/Ubuntu — .deb + apt, LTS, серверы/десктопы; RHEL/CentOS/Fedora — .rpm + dnf, RHEL для enterprise (платная поддержка), Fedora upstream; Arch — rolling release, pacman, минимальная базовая система, AUR; SUSE/openSUSE — YaST, rpm, enterprise; Alpine — musl libc, busybox, маленькие образы (< 5 МБ), популярен для Docker.
Типичные ошибки
- ✗Считать, что все дистрибутивы используют одну libc — Debian использует glibc, Alpine — musl; бинарник, скомпилированный на Debian, может упасть на Alpine из-за различий ABI
- ✗Рассматривать CentOS 8 как долгосрочно стабильный вариант — CentOS Stream заменил его как rolling preview для RHEL; используйте RHEL, Rocky или AlmaLinux для стабильности
- ✗Устанавливать одни и те же инструменты одинаково на всех дистрибутивах — имена пакетов различаются (напр.,
libboost-devна Debian vsboost-develна Fedora)
Уточняющие вопросы
- →В чём разница между rolling release и fixed release дистрибутивом?
- →Почему бинарники C++, скомпилированные на Ubuntu 20.04, не всегда работают на Ubuntu 18.04?
JuniorТеорияИногдаЧто такое системный вызов и как трассировщик strace показывает те, что делает процесс C++?
Что такое системный вызов и как трассировщик strace показывает те, что делает процесс C++?
Системный вызов — контролируемая граница, которую программа в user-space пересекает, чтобы запросить у ядра привилегированную операцию: файловый ввод-вывод, mmap, fork, сокеты — с переключением CPU в режим ядра и обратно. strace подключается через ptrace и логирует каждый syscall процесса с аргументами и кодом возврата, так что видно, где именно программа C++ обращается к ОС.
Типичные ошибки
- ✗Путать системный вызов с обычной функцией libc — многие функции libc (
printf) оборачивают syscall (write), но сами syscall'ом не являются - ✗Считать
straceбесплатным —ptraceостанавливает процесс на каждом syscall, так что I/O-нагруженную программу он может замедлить на порядок - ✗Забывать
strace -fдля слежения за дочерними процессамиfork— без него теряются системные вызовы каждого ребёнка
Уточняющие вопросы
- →Как
strace -cсводит число и время системных вызовов, и когда это полезнее полной трассы? - →Почему трассировка на
ptraceне может подключиться к чужому процессу без повышенных прав?
SeniorТеорияРедкоКак gdb, valgrind --leak-check=full и nm -C делят работу при локализации утечки в stripped-бинарнике C++?
Как gdb, valgrind --leak-check=full и nm -C делят работу при локализации утечки в stripped-бинарнике C++?
valgrind --leak-check=full запускает бинарник под инструментацией и печатает стек каждой утечки, разделяя definitely lost и still reachable, но замедляет код в ~10–30 раз и не подключается к живому prod-процессу. gdb открывает core dump и показывает кадр падения, локальные переменные и кучу. nm -C деманглит символы, чтобы адреса инструментов сопоставлялись с именами C++ — для stripped-бинарника используйте несрезанную сборку или пакет debug-символов.
Типичные ошибки
- ✗Гонять
valgrindпо боевому сервису, считая замедление в ~10–30 раз безобидным — оно меняет тайминги и может скрыть или сместить баг - ✗Доверять голым адресам в выводе
gdb/valgrindна stripped-бинарнике безnm -Cили пакета debug-символов для деманглинга - ✗Принимать
still reachableиз--leak-check=fullза утечку — обычно это не она; реально течёт классdefinitely lost
Уточняющие вопросы
- →Как оптимизации компилятора (
-O2, инлайнинг) ухудшают точность бэктрейса вgdb? - →Что даёт runtime-санитайзер
AddressSanitizerпо сравнению сvalgrind --leak-check=fullи какой ценой?