Главная/О курсе/Урок

Цели обучения

О чём этот файл

Этот файл фиксирует, чему именно учит курс, чему он не учит, какой уровень подготовки предполагается на входе и какой результат считается успешным. Прочитайте его до начала обучения: он задаёт ожидания и помогает выбрать учебное расписание.


Проблема, которую решает курс

Типичная ситуация: 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.

Курс строится на этом принципе. Каждая тема отвечает не только на вопрос «как сделать», но и на вопросы «что при этом происходит», «почему так устроено» и «где это перестаёт работать».


Цели курса

После прохождения курса учащийся сможет:

  1. Объяснить механику containers. Описать, как Linux containers работают на уровне processes, namespaces, cgroups, filesystem и networking; сказать, какие ресурсы container разделяет с host, а какие изолирует.
  2. Настроить среду. Установить и настроить Docker Engine в Linux из официального репозитория, управлять daemon, понимать роль Docker socket и осознанно выбирать между группой docker и rootless mode.
  3. Писать Dockerfile. Создавать качественные Dockerfile для Python-приложений: с корректным порядком слоёв, multi-stage build, non-root user, работающим build cache и без секретов в layers.
  4. Управлять containers. Запускать, отлаживать и обслуживать containers: понимать lifecycle, exit codes, restart policies, обработку сигналов и проблему PID 1.
  5. Работать с состоянием и сетью. Осознанно выбирать между volumes, bind mounts и tmpfs; связывать containers через user-defined networks; публиковать порты, понимая, что делает NAT.
  6. Проектировать многокомпонентные системы. Описывать stack на Docker Compose с healthchecks, зависимостями по готовности, изолированными networks и named volumes.
  7. Контейнеризировать Python-приложения. Python CLI, Flask, FastAPI и background worker — с корректным logging, graceful shutdown, worker configuration и учётом resource limits.
  8. Оптимизировать. Уменьшать image size и build time, опираясь на измерения (docker history, docker image inspect, время сборки), а не на догадки.
  9. Применять требования безопасности. Выявлять опасные настройки, объяснять сценарий риска и предлагать безопасную альтернативу.
  10. Интегрировать Docker в testing и CI/CD. Запускать integration tests с реальными зависимостями, собирать и публиковать images в pipeline с кэшем и сканированием.
  11. Диагностировать проблемы. Переходить от симптома к root cause по воспроизводимой методике, а не перебором.
  12. Понимать границы применения. Отличать задачи Docker от задач Kubernetes и аргументированно отказываться от контейнеризации там, где она вредна.

Детализация по уровням владения — в карте компетенций.


Профиль учащегося

Курс рассчитан на Python-разработчика, который:

  • пишет код профессионально и знает Python на рабочем уровне;
  • знаком с Linux command line;
  • понимает файлы, процессы, права доступа и environment variables;
  • умеет использовать Git;
  • имеет ограниченный практический опыт с Docker;
  • хочет понимать не только команды, но и внутреннее устройство системы.

Что считается известным

Курс не объясняет и свободно использует:

ОбластьПредполагаемое знание
PythonФункции, классы, модули, пакеты, import, исключения, if __name__ == "__main__"
Python packagingЧто такое пакет из PyPI, зачем нужен pip install
Shellcd, ls, cat, grep, chmod, конвейеры, перенаправление > и 2>&1
ПроцессыЧто такое PID, родительский процесс, exit code, kill
Файловая системаАбсолютные и относительные пути, права rwx, владелец и группа
СетьIP-адрес, TCP-порт, localhost, HTTP-запрос
Gitclone, commit, branch, что такое commit SHA

Что объясняется с нуля

ОбластьГде объясняется
Namespaces и cgroups02. Основы Containerization
OverlayFS и copy-on-write03. Работа с Images
Сигналы и PID 104. Containers и lifecycle
systemd в объёме, нужном для Docker01. Подготовка среды
NAT, bridge, veth08. Networking
Linux capabilities, seccomp12. Security
Основные объекты Kubernetes18. Docker и Kubernetes

Чему курс не учит

Явно обозначенные границы важны не меньше целей.

ТемаПочему вне курсаКуда идти дальше
Kubernetes на рабочем уровнеПолноценный Kubernetes — отдельный курс сопоставимого объёма. Здесь только обзорный раздел 18references/further-learning.md
Docker SwarmПрактически не развивается; overlay networks рассматриваются только обзорно
Docker Desktop, macOS, WindowsКурс про Linux. Docker Desktop упоминается только в сравненииОфициальная документация Docker Desktop
Администрирование LinuxКурс использует Linux, но не учит настраивать его
Разработка на PythonПредполагается уже освоенной
Podman, Buildah, containerd напрямуюУпоминаются как альтернативы; практика — только Dockerreferences/further-learning.md
Cloud-специфичные сервисы (ECS, Cloud Run, AKS)Слишком быстро меняются и различаются между провайдерамиДокументация провайдера
Windows containersДругая модель изоляции, не пересекается с материалом

Критерии успешного завершения

Курс считается пройденным, когда учащийся:

  1. Закрыл все разделы 01–19 (теория, упражнения, quiz) — таблица прогресса в MAIN.md.
  2. Выполнил все четыре проекта и прошёл их CHECKLIST.md.
  3. Прошёл все checkpoints.
  4. Решил не менее 15 из 20 debugging challenges самостоятельно.
  5. Набрал не менее 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

Как измерить свой стартовый уровень

Ответьте на вопросы до начала курса. Это не тест — это ориентир, показывающий, какие разделы потребуют больше времени.

  1. Что произойдёт с данными, записанными в /tmp внутри container, после docker rm?
  2. Чем CMD отличается от ENTRYPOINT?
  3. Почему приложение, слушающее 127.0.0.1:8000 внутри container, недоступно снаружи даже при -p 8000:8000?
  4. Что означает exit code 137?
  5. Почему изменение одной строки в requirements.txt может сделать сборку в десять раз дольше, а изменение кода — нет?
  6. Что видит ps aux, запущенный внутри container, и почему?
  7. Чем docker volume отличается от bind mount с точки зрения владельца файлов?
  8. Почему depends_on не гарантирует, что база данных готова принимать соединения?

Если уверенных ответов меньше четырёх — берите расписание B или C. Если больше шести — расписание A реалистично.

Ответы на все восемь вопросов появятся по ходу курса; сверить их можно будет по glossary и соответствующим разделам.


Навигация

Вернуться к главному оглавлению
Следующий материал → Карта компетенций

Markdown на GitHub ↗