Цели обучения
О чём этот файл
Этот файл фиксирует, чему именно учит курс, чему он не учит, какой уровень подготовки предполагается на входе и какой результат считается успешным. Прочитайте его до начала обучения: он задаёт ожидания и помогает выбрать учебное расписание.
Проблема, которую решает курс
Типичная ситуация: Python-разработчик умеет запустить docker compose up, скопировать Dockerfile из чужого проекта и добавить туда свою зависимость. Пока всё работает — вопросов нет. Проблемы начинаются, когда:
- container падает с exit code
137, и непонятно, кто его убил; print()не появляется вdocker logs, хотя приложение явно работает;- port опубликован,
curlс host не отвечает, а изнутри container всё доступно; - образ весит 1.2 GB, и никто не знает почему;
- при изменении одной строки в коде пересобираются все dependencies;
- приложение в Compose стартует раньше базы данных, хотя
depends_onпрописан; - файлы, созданные внутри container, принадлежат
rootи не удаляются с host.
Все эти симптомы объединяет одно: они не решаются подбором команд. Они решаются пониманием того, что Docker делает с процессами, файловой системой и сетью Linux.
Курс строится на этом принципе. Каждая тема отвечает не только на вопрос «как сделать», но и на вопросы «что при этом происходит», «почему так устроено» и «где это перестаёт работать».
Цели курса
После прохождения курса учащийся сможет:
- Объяснить механику containers. Описать, как Linux containers работают на уровне processes, namespaces, cgroups, filesystem и networking; сказать, какие ресурсы container разделяет с host, а какие изолирует.
- Настроить среду. Установить и настроить Docker Engine в Linux из официального репозитория, управлять daemon, понимать роль Docker socket и осознанно выбирать между группой
dockerи rootless mode. - Писать
Dockerfile. Создавать качественныеDockerfileдля Python-приложений: с корректным порядком слоёв, multi-stage build, non-root user, работающим build cache и без секретов в layers. - Управлять containers. Запускать, отлаживать и обслуживать containers: понимать lifecycle, exit codes, restart policies, обработку сигналов и проблему PID 1.
- Работать с состоянием и сетью. Осознанно выбирать между volumes, bind mounts и
tmpfs; связывать containers через user-defined networks; публиковать порты, понимая, что делает NAT. - Проектировать многокомпонентные системы. Описывать stack на
Docker Composeс healthchecks, зависимостями по готовности, изолированными networks и named volumes. - Контейнеризировать Python-приложения. Python CLI, Flask, FastAPI и background worker — с корректным logging, graceful shutdown, worker configuration и учётом resource limits.
- Оптимизировать. Уменьшать image size и build time, опираясь на измерения (
docker history,docker image inspect, время сборки), а не на догадки. - Применять требования безопасности. Выявлять опасные настройки, объяснять сценарий риска и предлагать безопасную альтернативу.
- Интегрировать Docker в testing и CI/CD. Запускать integration tests с реальными зависимостями, собирать и публиковать images в pipeline с кэшем и сканированием.
- Диагностировать проблемы. Переходить от симптома к root cause по воспроизводимой методике, а не перебором.
- Понимать границы применения. Отличать задачи Docker от задач Kubernetes и аргументированно отказываться от контейнеризации там, где она вредна.
Детализация по уровням владения — в карте компетенций.
Профиль учащегося
Курс рассчитан на Python-разработчика, который:
- пишет код профессионально и знает Python на рабочем уровне;
- знаком с Linux command line;
- понимает файлы, процессы, права доступа и environment variables;
- умеет использовать
Git; - имеет ограниченный практический опыт с Docker;
- хочет понимать не только команды, но и внутреннее устройство системы.
Что считается известным
Курс не объясняет и свободно использует:
| Область | Предполагаемое знание |
|---|---|
| Python | Функции, классы, модули, пакеты, import, исключения, if __name__ == "__main__" |
| Python packaging | Что такое пакет из PyPI, зачем нужен pip install |
| Shell | cd, ls, cat, grep, chmod, конвейеры, перенаправление > и 2>&1 |
| Процессы | Что такое PID, родительский процесс, exit code, kill |
| Файловая система | Абсолютные и относительные пути, права rwx, владелец и группа |
| Сеть | IP-адрес, TCP-порт, localhost, HTTP-запрос |
| Git | clone, commit, branch, что такое commit SHA |
Что объясняется с нуля
| Область | Где объясняется |
|---|---|
| Namespaces и cgroups | 02. Основы Containerization |
| OverlayFS и copy-on-write | 03. Работа с Images |
| Сигналы и PID 1 | 04. Containers и lifecycle |
systemd в объёме, нужном для Docker | 01. Подготовка среды |
| NAT, bridge, veth | 08. Networking |
| Linux capabilities, seccomp | 12. Security |
| Основные объекты Kubernetes | 18. Docker и Kubernetes |
Чему курс не учит
Явно обозначенные границы важны не меньше целей.
| Тема | Почему вне курса | Куда идти дальше |
|---|---|---|
| Kubernetes на рабочем уровне | Полноценный Kubernetes — отдельный курс сопоставимого объёма. Здесь только обзорный раздел 18 | references/further-learning.md |
| Docker Swarm | Практически не развивается; overlay networks рассматриваются только обзорно | — |
| Docker Desktop, macOS, Windows | Курс про Linux. Docker Desktop упоминается только в сравнении | Официальная документация Docker Desktop |
| Администрирование Linux | Курс использует Linux, но не учит настраивать его | — |
| Разработка на Python | Предполагается уже освоенной | — |
| Podman, Buildah, containerd напрямую | Упоминаются как альтернативы; практика — только Docker | references/further-learning.md |
| Cloud-специфичные сервисы (ECS, Cloud Run, AKS) | Слишком быстро меняются и различаются между провайдерами | Документация провайдера |
| Windows containers | Другая модель изоляции, не пересекается с материалом | — |
Критерии успешного завершения
Курс считается пройденным, когда учащийся:
- Закрыл все разделы 01–19 (теория, упражнения, quiz) — таблица прогресса в MAIN.md.
- Выполнил все четыре проекта и прошёл их
CHECKLIST.md. - Прошёл все checkpoints.
- Решил не менее 15 из 20 debugging challenges самостоятельно.
- Набрал не менее 70 баллов из 100 на итоговом практическом экзамене по rubric.
Практический критерий
Формальные баллы вторичны. Настоящий критерий формулируется так:
Учащемуся дают незнакомое Python-приложение и просят подготовить его к запуску в production. Он самостоятельно определяет base image, фиксирует зависимости, пишет multi-stage
Dockerfileс non-root user, настраивает logging и graceful shutdown, описывает stack в Compose с healthchecks, задаёт resource limits, объясняет каждое своё решение и умеет диагностировать проблему, когда что-то из этого сломается.
Если это выполнимо без подсказок — курс достиг цели.
Риски и ограничения курса
Честный список того, что может помешать.
| Риск | Проявление | Как снизить |
|---|---|---|
| Версионный дрейф | Docker меняется; команды и вывод могут отличаться от показанных | Каждый раздел содержит ссылки на официальные источники. Сверяйте версионно-зависимые темы. Курс проверялся в июле 2026 на Docker Engine 28–29 |
| Различия дистрибутивов | Пути, имена пакетов и systemd unit могут отличаться от Ubuntu | Дистрибутиво-зависимые команды помечены явно. Базовая среда — Ubuntu LTS |
| cgroup v1 против v2 | На старых системах пути cgroup и вывод docker stats отличаются | Курс ориентирован на cgroup v2. Проверка версии — в разделе 01 |
| containerd image store | В Docker Engine 29 вывод docker images и поведение save/load отличаются от прежнего | Различия объясняются в разделе 03 отдельно |
| Чтение без выполнения | Материал кажется понятным, навык не формируется | Каждый раздел содержит exercises.md с проверкой результата. Выполняйте команды в реальной системе |
| Пропуск разделов | Раздел 09 непонятен без 07 и 08 | Зависимости зафиксированы в карте курса. Разделы 01–09 читаются строго последовательно |
| Иллюзия безопасности | Контейнеризация воспринимается как защита | Раздел 12 начинается с явного утверждения: изоляция container не равна security boundary |
| Рекомендации как догмы | «Один процесс на container» применяется буквально везде | Курс всюду отделяет факт от рекомендации и показывает исключения |
| Ограниченные ресурсы машины | Раздел 09 и проект 3 поднимают несколько сервисов сразу | Нужно не менее 4 GB RAM и 20 GB диска. Команды очистки — в cleanup checklist |
Как измерить свой стартовый уровень
Ответьте на вопросы до начала курса. Это не тест — это ориентир, показывающий, какие разделы потребуют больше времени.
- Что произойдёт с данными, записанными в
/tmpвнутри container, послеdocker rm? - Чем
CMDотличается отENTRYPOINT? - Почему приложение, слушающее
127.0.0.1:8000внутри container, недоступно снаружи даже при-p 8000:8000? - Что означает exit code
137? - Почему изменение одной строки в
requirements.txtможет сделать сборку в десять раз дольше, а изменение кода — нет? - Что видит
ps aux, запущенный внутри container, и почему? - Чем
docker volumeотличается от bind mount с точки зрения владельца файлов? - Почему
depends_onне гарантирует, что база данных готова принимать соединения?
Если уверенных ответов меньше четырёх — берите расписание B или C. Если больше шести — расписание A реалистично.
Ответы на все восемь вопросов появятся по ходу курса; сверить их можно будет по glossary и соответствующим разделам.
Навигация
Вернуться к главному оглавлению
Следующий материал → Карта компетенций