Для чего используется Docker
Что проверяют
Понимаете ли вы, что контейнер это изоляция процесса, а не виртуальная машина, и зачем это нужно на практике.
Как отвечать
Docker упаковывает приложение вместе с зависимостями в образ, который одинаково запускается везде. Решает он в первую очередь задачу «у меня работает»: версия Python, системные библиотеки и переменные окружения зафиксированы в образе, а не в голове разработчика.
Как устроено: контейнер это процесс хоста, изолированный средствами ядра (пространства имён для файловой системы, сети и процессов, cgroups для ограничения ресурсов). Своего ядра у него нет, поэтому запуск занимает доли секунды, а накладные расходы близки к нулю. Виртуальная машина, в отличие от этого, поднимает целую операционную систему.
Где применяется в обычном проекте:
- разработка:
docker compose upподнимает базу, Redis и очередь нужных версий, никто не ставит их себе локально; - тесты: интеграционные проверки на настоящей базе в контейнере, а не на заглушках;
- сборка и доставка: тот же образ едет со стенда в прод, различаются только переменные окружения;
- эксплуатация: одинаковый способ запуска для любого языка, а дальше оркестрация Kubernetes.
Полезно назвать практику для Python: многоступенчатая сборка, чтобы в финальном образе не было компиляторов; отдельный слой для зависимостей, чтобы кэш не сбрасывался на каждое изменение кода; непривилегированный пользователь; .dockerignore.
Где спотыкаются
Называют контейнер лёгкой виртуальной машиной.
Кладут в образ секреты и потом удивляются, что они видны в слоях.
Не понимают, что данные в контейнере исчезают при пересоздании, и не используют тома.
Ставят зависимости после копирования кода, из-за чего кэш слоёв не работает.