Главная/О курсе и репозитории/Обзор

Docker и Containerization для Python-разработчика

Практический инженерный курс по Docker для Linux, построенный вокруг реальных задач Python-разработчика. Курс не ограничивается перечислением команд: каждая тема объясняет, что именно происходит в Linux kernel и в Docker Engine, почему механизм устроен именно так, какие у него ограничения и какие типичные ошибки совершают разработчики.

Курс охватывает путь от установки Docker Engine в Ubuntu до production-ready pipeline с multi-stage builds, non-root execution, healthchecks, resource limits, vulnerability scanning и SBOM. Отдельное внимание уделено тому, что специфично именно для Python: выбор base image, dependency locking, build cache, PYTHONUNBUFFERED и logging, PID 1 и обработка SIGTERM, worker configuration для Gunicorn и Uvicorn, поведение memory allocator под cgroup limits.

Материал построен последовательно: каждый следующий раздел опирается только на понятия, введённые ранее. Все команды применимы в обычной Linux-системе без Docker Desktop. Все примеры воспроизводимы и существуют не только в виде code blocks, но и в виде рабочих файлов в resources/examples/.

Курс написан на русском языке. Технические термины, команды, имена файлов, параметры, код и сообщения терминала остаются на английском — так, как вы встретите их в документации и в работе.


Оглавление

Разделы читаются по порядку. Описание каждого раздела — ниже, в «Структуре курса». То же оглавление отдельным файлом — CONTENTS.md.

00. О курсеЦели обучения · Карта компетенций · Карта курса и зависимости между разделами · Варианты учебного расписания · Система оценивания

Раздел 1. Подготовка среды1.1. Требования к Linux · 1.2. Установка Docker Engine · 1.3. Docker daemon · 1.4. Первый container · 1.5. Docker socket и группа docker · 1.6. Rootless Docker · Задания

Раздел 2. Основы Containerization2.1. Процессы и containers · 2.2. Containers против virtual machines · 2.3. Linux namespaces · 2.4. Cgroups · 2.5. Capabilities · 2.6. Container runtime и OCI · 2.7. Терминология Docker · Задания

Раздел 3. Работа с Images3.1. Архитектура image · 3.2. Слои и copy-on-write · 3.3. Tags и digests · 3.4. Управление images · 3.5. Save, load, export, import · Задания

Раздел 4. Containers и lifecycle4.1. Состояния и переходы · 4.2. Режимы запуска · 4.3. Exec, logs, inspect · 4.4. Сигналы и graceful shutdown · 4.5. PID 1 и init · 4.6. Restart policies и exit codes · Задания

Раздел 5. Dockerfile5.1. Build context и .dockerignore · 5.2. Базовые инструкции · 5.3. COPY, ADD и RUN · 5.4. CMD и ENTRYPOINT · 5.5. Build cache · 5.6. BuildKit · 5.7. Multi-stage builds · 5.8. HEALTHCHECK · 5.9. Воспроизводимые сборки · Задания

Раздел 6. Python внутри Container6.1. Выбор base image · 6.2. Управление зависимостями · 6.3. Python Dockerfile · 6.4. Environment variables · 6.5. Сигналы и PID 1 в Python · 6.6. Logging · 6.7. Non-root user и permissions · 6.8. CLI-приложение · 6.9. Flask · 6.10. FastAPI · 6.11. Worker processes · 6.12. Тестирование в container · 6.13. Resource limits и память Python · Задания

Раздел 7. Storage7.1. Файловая система container · 7.2. Volumes · 7.3. Bind mounts · 7.4. tmpfs и read-only filesystem · 7.5. Права доступа, UID и GID · 7.6. Backup и restore · Задания

Раздел 8. Docker Networking8.1. Основы Docker networking · 8.2. Bridge networks · 8.3. Port publishing · 8.4. Docker DNS · 8.5. Network modes · 8.6. Диагностика · Задания

Раздел 9. Docker Compose9.1. Основы Compose · 9.2. Справочник по services · 9.3. Networks и volumes · 9.4. Healthchecks и зависимости · 9.5. Environment и secrets · 9.6. Несколько файлов и profiles · 9.7. Практический stack · Задания

Раздел 10. Development workflow10.1. Development и production образы · 10.2. Hot reload · 10.3. Отладка в container · 10.4. Database migrations · 10.5. Автоматизация · Задания

Раздел 11. Production-ready containers11.1. Принципы production · 11.2. Runtime hardening · 11.3. Healthchecks и readiness · 11.4. Resource limits и память Python · 11.5. Конфигурация и secrets · 11.6. Supply chain · Задания

Раздел 12. Security12.1. Модель угроз · 12.2. Daemon и socket · 12.3. Пользователи и namespaces · 12.4. Capabilities и privileged · 12.5. Seccomp, AppArmor, SELinux · 12.6. Secrets · 12.7. Supply chain security · Задания

Раздел 13. Observability и диагностика13.1. Логи и logging drivers · 13.2. Inspect, events, stats · 13.3. Нехватка ресурсов · 13.4. Дисковое пространство и очистка · 13.5. Глубокая диагностика · 13.6. Таблица диагностики · Задания

Раздел 14. Registry14.1. Основы registry · 14.2. Аутентификация · 14.3. Локальный registry · 14.4. Стратегия tagging · Задания

Раздел 15. Testing15.1. Стратегия тестирования · 15.2. Тесты внутри container · 15.3. Integration tests через Compose · 15.4. Testcontainers for Python · 15.5. Валидация образа · Задания

Раздел 16. CI/CD16.1. Проектирование pipeline · 16.2. GitHub Actions · 16.3. Build cache в CI · 16.4. Сканирование и SBOM · 16.5. GitLab CI · Задания

Раздел 17. Docker internals17.1. Engine API и Unix socket · 17.2. containerd, shim и runc · 17.3. Namespaces: углублённо · 17.4. Cgroups v2 · 17.5. OverlayFS · Задания

Раздел 18. Docker и Kubernetes18.1. Какие задачи решают Docker и Kubernetes · 18.2. Объекты Kubernetes · 18.3. От Compose к Kubernetes · 18.4. Когда нужна orchestration · Задания

Раздел 19. Ограничения Docker19.1. Где containers усложняют систему · 19.2. Границы изоляции · 19.3. Когда Docker применять не следует · 19.4. Каталог антипаттернов · Задания

Практические проекты1. Python CLI · 2. FastAPI service · 3. Multi-service stack · 4. Production pipeline · обзор

Проверка знанийQuizzes · Checkpoints · Debugging challenges · Теоретический тест · Практический экзамен · Grading rubric

СправочникиDocker CLI · Dockerfile · Compose · Networking · Storage · Production · Security · Python container · Debugging · Cleanup · Антипаттерны · Карта решений · Glossary · Дальнейшее развитие


Для кого этот курс

Курс рассчитан на Python-разработчика, который уже пишет код профессионально, но использует Docker поверхностно — по инструкции от коллег или по скопированному Dockerfile.

Необходимые начальные знания:

  • Python на рабочем уровне (курс не объясняет базовый синтаксис);
  • уверенная работа в Linux command line: файлы, каталоги, права доступа, перенаправление потоков;
  • понимание процессов, environment variables, exit codes;
  • базовое владение Git;
  • понимание, что такое HTTP-запрос и TCP-порт.

Не требуется: опыт администрирования Linux, знание Kubernetes, опыт настройки CI/CD.

Целевая платформа: Linux, современная LTS-версия Ubuntu (22.04 / 24.04 / 26.04), Docker Engine 28–29, Docker Compose v2, Bash, Python 3.13. Курс не строится вокруг Docker Desktop — он упоминается только в сравнительном контексте.


Что учащийся будет уметь

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

  1. Объяснить, как Linux containers работают на уровне processes, namespaces, cgroups, filesystem и networking.
  2. Установить и настроить Docker Engine в Linux, включая rootless mode.
  3. Читать и писать качественные Dockerfile для Python-приложений.
  4. Запускать, отлаживать и обслуживать containers, понимая их lifecycle и signal handling.
  5. Осознанно работать с images, volumes, bind mounts, networks и registries.
  6. Проектировать многокомпонентные системы на Docker Compose.
  7. Контейнеризировать Python CLI, Flask, FastAPI и background worker.
  8. Оптимизировать image size, build time и runtime behaviour, опираясь на измерения, а не на догадки.
  9. Применять базовые требования безопасности и объяснять, почему конкретная настройка опасна.
  10. Интегрировать Docker в testing и CI/CD.
  11. Диагностировать реальные проблемы containers по симптомам.
  12. Понимать границы применения Docker и отличие Docker от Kubernetes.

Подробная карта компетенций с уровнями владения: 00-course-overview/01-competency-map.md.


Как пользоваться курсом

В каком порядке читать материалы

Разделы пронумерованы в порядке изучения. Каждый раздел содержит собственный MAIN.md — локальное оглавление со списком материалов, целями и критериями завершения. Внутри раздела читайте файлы в порядке числовых prefixes.

Разделы 01–09 составляют обязательное ядро и читаются строго последовательно: пропуск любого из них ломает понимание последующих. Разделы 10–19 допускают частичную перестановку — зависимости описаны в карте курса.

Когда выполнять упражнения

В каждом разделе есть файл exercises.md. Правило простое: упражнения раздела выполняются до перехода к следующему разделу. Отдельные уроки также содержат встроенное практическое задание с подсказками и решением под спойлером — сначала выполните задание, потом смотрите решение.

Все команды выполняйте в реальной системе. Чтение команд без выполнения не даёт нужного навыка: значительная часть материала посвящена интерпретации фактического вывода.

Когда переходить к projects

Проекты привязаны к контрольным точкам:

ПроектВыполнять после раздела
01. Python CLI06. Python containers
02. FastAPI service08. Networking
03. Multi-service stack10. Development workflow
04. Production pipeline16. CI/CD

Проект выполняется самостоятельно по TASK.md. SOLUTION.md открывается только после собственной попытки, CHECKLIST.md используется для самопроверки перед тем, как считать проект завершённым.

Как использовать assessments

  • Quiz после каждого разделаassessments/module-quizzes.md. Занимает 10–15 минут, проверяет понимание, а не запоминание.
  • Checkpoint после группы разделовassessments/checkpoints.md. Практическая задача с критериями приёмки.
  • Debugging challengesassessments/debugging-challenges.md. 20 сломанных конфигураций, которые нужно починить. Начинайте после раздела 13.
  • Итоговый экзаментеория и практика.
  • Оценкаassessments/grading-rubric.md, шкала 0–100, проходной результат 70.

Как отмечать progress

Используйте таблицу «Прогресс курса» в этом файле. Отредактируйте её локально: замените на в столбцах «Теория», «Практика», «Проверка». Раздел считается пройденным только когда закрыты все три столбца.

Статус самого репозитория (что уже написано автором курса) отслеживается отдельно в COURSE_STATUS.md — не путайте его с вашим личным прогрессом.

Где находятся reference materials

Все справочники собраны в references/. Они не предназначены для чтения подряд — это материал для быстрого поиска во время работы. Рабочие примеры кода — в resources/examples/, текстовые диаграммы — в resources/diagrams/, проверенные официальные источники — в resources/source-links.md.


Структура курса

0. Обзор курса

Цели обучения, карта компетенций, зависимости между разделами, три варианта учебного расписания и описание системы оценивания. Читается до начала обучения, чтобы выбрать темп и понимать, к чему ведёт курс.

Предварительные знания: нет. Результат: учащийся выбрал расписание и понимает структуру курса.

Перейти к разделу


1. Подготовка среды

Требования к Linux, проверка architecture и kernel, установка Docker Engine из официального apt repository, управление daemon через systemctl, Docker socket, группа docker и её риски, rootless mode, полное удаление Docker. Раздел даёт рабочую среду, на которой строится весь остальной курс.

Предварительные знания: Linux command line, sudo, apt. Результат: учащийся имеет работающий Docker Engine, понимает, чем управляет systemctl, и осознаёт последствия добавления пользователя в группу docker.

Перейти к разделу


2. Основы Containerization

Что такое process и почему container — это изолированный Linux process, а не «лёгкая виртуальная машина». Namespaces, cgroups, capabilities, root filesystem, container runtime, OCI, архитектура Docker Engine, containerd и runc. Вводится базовая терминология: image, container, registry, repository, tag, digest.

Предварительные знания: раздел 01, понимание процессов в Linux. Результат: учащийся может объяснить, какие ресурсы container разделяет с host, и показать это командами.

Перейти к разделу


3. Работа с Images

Архитектура image: layers, content-addressable storage, immutable layers, writable container layer и copy-on-write. Manifest и config, tags против digests, pull policy, локальный кэш, docker history, dangling images, разница между save/load и export/import. Учитывается изменение поведения в Docker Engine 29 с containerd image store.

Предварительные знания: раздел 02. Результат: учащийся читает metadata image, объясняет, из чего состоит его размер, и переносит image между машинами без registry.

Перейти к разделу


4. Containers и lifecycle

Полный жизненный цикл: create, start, run, stop, kill, restart, pause, rm. Foreground и detached mode, interactive и TTY, стандартные потоки, exec, logs, inspect, stats. Отдельно разбираются exit codes, restart policies, обработка SIGTERM и SIGKILL, проблема PID 1, zombie processes и флаг --init.

Предварительные знания: разделы 02, 03. Результат: учащийся корректно останавливает приложение, читает exit code и объясняет, почему container не завершился за 10 секунд.

Перейти к разделу


5. Dockerfile

Подробный разбор всех инструкций Dockerfile с указанием назначения, синтаксиса, типичной ошибки и случаев, когда инструкцию применять не следует. Build context и .dockerignore, exec form против shell form, различие CMD и ENTRYPOINT, layer cache и build cache, BuildKit, cache mounts, secret mounts, multi-stage builds, reproducible builds.

Предварительные знания: разделы 03, 04. Результат: учащийся пишет Dockerfile, который пересобирается за секунды при изменении кода и не тянет dependencies заново.

Перейти к разделу


6. Python внутри Container

Центральный раздел курса. Выбор base image и цена Alpine для Python, glibc против musl, wheels и compilation dependencies, pip / requirements.txt / pyproject.toml / Poetry / uv с разбором trade-offs, нужен ли venv внутри container, PYTHONDONTWRITEBYTECODE и PYTHONUNBUFFERED, logging в stdout, non-root user и filesystem permissions, graceful shutdown, Gunicorn и Uvicorn, worker processes, CLI-приложения, background workers, тестирование и resource limits.

Предварительные знания: раздел 05. Результат: учащийся самостоятельно создаёт безопасный и оптимизированный image для Python-приложения.

Перейти к разделу


7. Storage

Writable container layer и эфемерность данных, named и anonymous volumes, bind mounts, tmpfs, read-only root filesystem, ownership и проблема UID/GID, SELinux context, backup и restore volumes, orphaned volumes, данные баз данных и монтирование исходного кода в разработке. Разбирается, почему bind mount может «скрыть» файлы внутри image.

Предварительные знания: разделы 04, 06. Результат: учащийся сохраняет данные между пересозданиями container и чинит проблемы с правами доступа без chmod 777.

Перейти к разделу


8. Docker Networking

Как Docker использует Linux network namespaces, virtual Ethernet pairs, bridges, routing и NAT. Default bridge против user-defined bridge, port publishing и разница между published и exposed ports, встроенный DNS и service discovery, host и none networks, обзор overlay и IPv6. Отдельно разбираются классические ошибки с localhost внутри container.

Предварительные знания: раздел 04, базовое понимание TCP/IP. Результат: учащийся связывает containers между собой, публикует порты осознанно и диагностирует недоступность сервиса по шагам.

Перейти к разделу


9. Docker Compose

Compose Specification и compose.yaml: services, build, environment и env files, ports, volumes, networks, configs, secrets, healthcheck, depends_on, restart, profiles, resource limits, project name, overrides и несколько Compose-файлов, interpolation, anchors. Подробно объясняется, почему depends_on не гарантирует готовность приложения принимать запросы.

Предварительные знания: разделы 07, 08. Результат: учащийся описывает stack из FastAPI, PostgreSQL, Redis и worker с healthchecks и изолированными networks.

Перейти к разделу


10. Development workflow

Разделение development и production images, bind mounts и hot reload, отладка через IDE и remote debugger, .env и secrets в разработке, database migrations, disposable environments, Makefile и helper scripts, pre-commit, linting, type checking, unit и integration tests. Формируется целостный рабочий процесс Python-разработчика.

Предварительные знания: раздел 09. Результат: учащийся собирает повторяемое окружение разработки, которое поднимается одной командой.

Перейти к разделу


11. Production-ready containers

Immutable infrastructure, «один процесс на container» как guideline, а не закон, non-root execution, read-only root filesystem, pinned versions и digests, healthcheck, readiness против liveness, structured logging, graceful shutdown и timeouts, resource limits и поведение памяти Python, worker count, конфигурация и secrets, image scanning, SBOM, provenance, rollback, registry authentication.

Предварительные знания: разделы 06, 09. Результат: учащийся превращает development image в production-ready image и доказывает это проверками.

Перейти к разделу


12. Security

Почему изоляция container не равна полноценной security boundary. Привилегии Docker daemon и Docker socket, риски группы docker, root внутри container, user namespaces, rootless Docker, Linux capabilities, privileged containers, seccomp, AppArmor, SELinux, secrets и build secrets, registry credentials, image signing, supply-chain risks. Для каждой опасной настройки — сценарий риска и безопасная альтернатива.

Предварительные знания: разделы 02, 11. Результат: учащийся выявляет опасные настройки в чужой конфигурации и обосновывает исправления.

Перейти к разделу


13. Observability и диагностика

Logs и logging drivers, inspect, events, stats, top, исследование файловой системы и сети container, DNS troubleshooting, resource exhaustion, OOM killer, exit codes 137 и 143, failing healthcheck, restart loops, заполнение диска, daemon logs через journalctl, nsenter, strace и tcpdump. Раздел содержит таблицу диагностики из более чем 20 типичных проблем.

Предварительные знания: разделы 04, 07, 08. Результат: учащийся переходит от симптома к root cause по воспроизводимой методике.

Перейти к разделу


14. Registry

Docker Hub и private registry, repository и namespaces, tags и digests, immutable tags, authentication и хранение credentials, push и pull, стратегия именования и cleanup policy, rate limits как версионно-зависимая тема, запуск локального registry, TLS и insecure registries, аутентификация из CI.

Предварительные знания: разделы 03, 11. Результат: учащийся публикует image в registry и проверяет, что развёрнут именно тот artifact, который был собран.

Перейти к разделу


15. Testing

Unit и integration tests, container-based tests, disposable databases, изоляция тестов, fixtures, Docker Compose для тестов, healthchecks и wait strategies, pytest, Testcontainers for Python, тестирование сети и файловой системы, build validation, обзор container structure tests.

Предварительные знания: разделы 09, 10. Результат: учащийся запускает integration tests с реальным PostgreSQL, которые создают и удаляют окружение автоматически.

Перейти к разделу


16. CI/CD

Практический pipeline: formatting, linting, type checking, unit tests, сборка image с build cache, integration tests, сканирование, tagging по commit SHA, публикация в registry без раскрытия secrets. Полностью рабочий пример для GitHub Actions и краткий эквивалент для GitLab CI.

Предварительные знания: разделы 14, 15. Результат: учащийся имеет pipeline, который собирает, проверяет и публикует image автоматически.

Перейти к разделу


17. Docker internals

Углублённый разбор: Docker Engine API и Unix socket, архитектура daemon–client, containerd, shim, runc, OCI bundle, cgroups v2, OverlayFS, все типы namespaces, seccomp и capabilities на уровне ядра, полный lifecycle процесса container. Раздел объясняет то, что в остальных разделах принималось как данность.

Предварительные знания: разделы 02, 12. Результат: учащийся обращается к Docker API напрямую, входит в namespace container и находит его файловую систему на host.

Перейти к разделу


18. Docker и Kubernetes

Обзорный, но технически точный раздел. Какую задачу решает Docker и какую — Kubernetes, почему они не прямые конкуренты, image portability и container runtime, pod, deployment, service, config, secret, volume, health probes, resource requests и limits, соответствие между Compose и Kubernetes, когда Compose достаточно и когда orchestration становится необходимой.

Предварительные знания: разделы 09, 11. Результат: учащийся обоснованно отвечает на вопрос «нужен ли нам Kubernetes».

Перейти к разделу


19. Ограничения Docker

Ситуации, где containers усложняют систему, не дают достаточной изоляции, создают проблемы с persistent state, затрудняют отладку и требуют дополнительной observability. Почему containers не заменяют virtual machines, configuration management и orchestration и не исправляют плохую архитектуру приложения. Список из более чем 30 антипаттернов и раздел «Когда Docker применять не следует».

Предварительные знания: разделы 11, 12, 13. Результат: учащийся способен аргументированно отказаться от контейнеризации там, где она вредна.

Перейти к разделу


Практические проекты

Проект 1. Python CLI

Контейнеризованное CLI-приложение: разбор arguments, чтение configuration, вывод результата в stdout, корректные exit codes, unit tests, сборка через Dockerfile. Проект закрепляет базовую работу с images и lifecycle.

Техническое задание

Проект 2. FastAPI service

REST API на FastAPI под Uvicorn: health endpoint, конфигурация через environment variables, structured logging, graceful shutdown, non-root user, multi-stage build, tests. Проект соединяет разделы про Dockerfile, Python и networking.

Техническое задание

Проект 3. Multi-service stack

Полный stack на Docker Compose: FastAPI, PostgreSQL, Redis, background worker, healthchecks, named volumes, user-defined networks, database migrations и integration tests. Проект проверяет умение проектировать систему, а не отдельный container.

Техническое задание

Проект 4. Production pipeline

Production-ready image и CI pipeline: tagging, push в registry, vulnerability scan, test stage, build cache, SBOM, deployment checklist и rollback plan. Итоговый проект курса.

Техническое задание

Общее описание проектов и порядок их выполнения: projects/MAIN.md.


Система проверки знаний

ИнструментНазначениеСсылка
QuizzesКороткий тест после каждого разделаmodule-quizzes.md
CheckpointsПрактическая контрольная точка после группы разделовcheckpoints.md
Debugging challenges20 сломанных конфигураций для самостоятельного ремонтаdebugging-challenges.md
Practical assignmentsПрактические задания внутри разделовexercises.md в каждом разделе
Итоговый теоретический тестПроверка понимания механизмовfinal-theory-exam.md
Итоговый практический экзаменКонтейнеризация приложения с нуляfinal-practical-exam.md
Grading rubricШкала 0–100, проходной результат 70grading-rubric.md

Обзор системы оценивания: assessments/MAIN.md и 00-course-overview/04-assessment-system.md.


Варианты учебного расписания

Планы A и B имеют одинаковый бюджет времени и охват и различаются только плотностью занятий. План C сокращён осознанно: вместо поверхностного прохода по всем разделам он даёт прочное ядро.

ВариантДлительностьНагрузкаОхватКому подходит
A. Интенсивный4 недели2–3 часа в деньРазделы 00–16, 18, 19 + проекты 1–2Есть выделенное время, нужен быстрый выход на рабочий уровень
B. Стандартный8 недель1–1.5 часа в деньТо жеОбучение параллельно с основной работой
C. Спокойный12 недель4–5 часов в неделюРазделы 00–11, 13 + проекты 1–2Нерегулярный график, упор на закрепление

Элементы, не вошедшие в базовый план (проекты 3–4, debugging challenges, раздел 17, итоговый экзамен), собраны в этап «Завершение курса» — примерно 56 часов.

Подробные планы с понедельной разбивкой, контрольными точками и сроками проектов: 00-course-overview/03-learning-schedules.md.


Прогресс курса

Отмечайте свой прогресс здесь. Раздел закрыт, когда заполнены все три столбца.

РазделТеорияПрактикаПроверкаСтатус
00. Обзор курсаНе начат
01. Подготовка средыНе начат
02. Основы ContainerizationНе начат
03. Работа с ImagesНе начат
04. Containers и lifecycleНе начат
05. DockerfileНе начат
06. Python внутри ContainerНе начат
Проект 1. Python CLIНе начат
07. StorageНе начат
08. NetworkingНе начат
Проект 2. FastAPI serviceНе начат
09. Docker ComposeНе начат
10. Development workflowНе начат
Проект 3. Multi-service stackНе начат
11. ProductionНе начат
12. SecurityНе начат
13. ObservabilityНе начат
14. RegistryНе начат
15. TestingНе начат
16. CI/CDНе начат
Проект 4. Production pipelineНе начат
17. Docker internalsНе начат
18. Docker и KubernetesНе начат
19. Ограничения DockerНе начат
Итоговый экзаменНе начат

Обозначения: — не сделано, — сделано, — неприменимо.


Быстрые ссылки

Справочники

Checklists

Итоговые материалы

Материалы и источники


Статус репозитория

Курс создаётся последовательно. Актуальное состояние каждого раздела — в COURSE_STATUS.md. Файлы, отмеченные там как «В работе» или «Не начат», могут отсутствовать или быть неполными.

Markdown на GitHub ↗