Учебник Docker для начинающих
Docker — инструмент, который упаковывает приложение вместе со всем его окружением в переносимый контейнер и запускает его одинаково на ноутбуке разработчика, на сервере и в облаке. Этот курс проведёт вас от первого docker run до полноценного многоконтейнерного стека на Docker Compose.
Вы научитесь запускать и останавливать контейнеры, собирать собственные образы через Dockerfile, сохранять данные в томах, связывать контейнеры по сети и поднимать приложение вместе с базой данных одной командой. Курс рассчитан на разработчиков, которые знают командную строку, но ещё не работали с контейнерами. Все примеры практические: контейнеризация веб-приложения, запуск nginx и PostgreSQL.
Курс «Docker» состоит из 10 разделов и 38 уроков: Введение в контейнеризацию, Образы и контейнеры, Создание образов с Dockerfile, Данные и тома, Сети и порты, Docker Compose, Оптимизация образов, Docker под капотом, Docker в продакшене и Реестры, безопасность и CI/CD. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в контейнеризацию
- Какую проблему решает Docker
Почему «работает у меня на машине» — это боль, и как контейнеризация решает проблему различий окружений между разработкой и продакшеном.
- Контейнер против виртуальной машины
Чем контейнер отличается от виртуальной машины: общее ядро ОС, лёгкость, скорость запуска и когда что выбирать.
- Ключевые понятия: образ, контейнер, реестр
Образ, контейнер и реестр — три базовых понятия Docker. Как они связаны и чем образ отличается от контейнера.
- Установка Docker и первый запуск
Как установить Docker Desktop или Docker Engine, проверить версию и запустить hello-world для проверки работоспособности.
- Какую проблему решает Docker
2 Образы и контейнеры
- Запуск контейнера: docker run и флаги
Команда docker run и ключевые флаги: -d для фона, -it для интерактива, --name для имени, -p для проброса портов.
- Жизненный цикл контейнера
Управление контейнерами: docker ps для списка, stop и start для остановки и запуска, rm для удаления.
- Образы и Docker Hub
Работа с образами: docker images для списка, docker pull для скачивания, теги версий и официальные образы Docker Hub.
- Вход в контейнер и логи
Отладка контейнеров: docker exec для запуска команд внутри и входа в оболочку, docker logs для просмотра вывода.
- Запуск контейнера: docker run и флаги
3 Создание образов с Dockerfile
- Что такое Dockerfile
Dockerfile — текстовый рецепт сборки образа. Зачем он нужен, как выглядит и чем отличается от готового образа.
- Основные инструкции Dockerfile
Разбор инструкций Dockerfile: FROM, WORKDIR, COPY, RUN, CMD, EXPOSE и ENV — что делает каждая и когда применяется.
- Сборка образа: docker build
Как собрать образ командой docker build -t, что такое контекст сборки и как запустить контейнер из своего образа.
- Слои, кэширование и .dockerignore
Почему образ состоит из слоёв, как работает кэш сборки, почему важен порядок инструкций и зачем нужен .dockerignore.
- Что такое Dockerfile
4 Данные и тома
- Почему данные в контейнере эфемерны
Записываемый слой контейнера исчезает вместе с ним. Почему данные нужно выносить из контейнера наружу.
- Именованные тома
Именованные тома Docker: создание через docker volume, подключение флагом -v и хранение данных PostgreSQL между перезапусками.
- Bind mounts и выбор подхода
Bind mounts — монтирование папки хоста в контейнер. Чем отличаются от томов и когда что использовать.
- Почему данные в контейнере эфемерны
5 Сети и порты
- Проброс портов наружу
Как флаг -p публикует порт контейнера на хосте, формат host:container и публикация нескольких портов.
- Сети Docker и драйвер bridge
Сети Docker, драйвер bridge по умолчанию, создание пользовательской сети через docker network и зачем она нужна.
- Связь контейнеров по имени
Как контейнеры в одной сети находят друг друга по имени: встроенный DNS вместо IP-адресов на примере приложения и PostgreSQL.
- Проброс портов наружу
6 Docker Compose
- Зачем нужен Docker Compose
Docker Compose описывает многоконтейнерное приложение в одном файле, заменяя длинные команды docker run одной командой запуска.
- Структура файла compose.yaml
Разбор compose.yaml: services, image, ports, volumes, environment и depends_on — что задаёт каждый ключ.
- Запуск и управление стеком
Команды Docker Compose: up для запуска стека, флаг -d, down для остановки, logs и ps для наблюдения за сервисами.
- Пример: приложение и база данных
Полный пример Docker Compose: веб-приложение, PostgreSQL и nginx в одном compose.yaml с сетью, томами и зависимостями.
- Зачем нужен Docker Compose
7 Оптимизация образов
- Слои и кэширование сборки
Как работает build cache в Docker: хеширование слоёв, инвалидация COPY/RUN, паттерн COPY package.json до кода для Node, Go и Python, отладка кэша.
- Multi-stage builds: маленькие образы
Multi-stage builds в Docker: несколько стадий FROM, COPY --from, отделение сборки от рантайма. Примеры для Go и Node — образ 1.2GB против 15MB.
- Минимальные образы: alpine, distroless, .dockerignore
Как выбрать базовый образ Docker: alpine, debian-slim или distroless. Уменьшаем размер и поверхность атаки, объединяем RUN и чистим кэш пакетов.
- BuildKit: современная сборка
BuildKit — современный движок сборки Docker: параллельные стадии, secret mounts без утечек в слои, cache mounts для npm и pip, мультиплатформа buildx.
- Слои и кэширование сборки
8 Docker под капотом
- Архитектура Docker: демон, клиент, containerd, OCI
Архитектура Docker: клиент docker, демон dockerd, containerd и runc, что такое OCI-образ и OCI-runtime и почему контейнер — это не виртуалка.
- Файловая система образа: слои и overlay
Файловая система Docker-образа: union-/overlayfs, read-only слои образа и writable-слой контейнера, copy-on-write, docker history и docker diff.
- Изоляция: namespaces и cgroups в контексте Docker
Как Docker изолирует контейнеры: namespaces Linux (pid, net, mnt, uts, ipc, user) разделяют видимость, а cgroups ограничивают CPU и память контейнера.
- Что происходит при docker run: жизненный цикл контейнера
Жизненный цикл контейнера Docker: pull, create, start, PID 1, остановка по SIGTERM и SIGKILL, remove, состояния и почему контейнер «умирает» сразу.
- Архитектура Docker: демон, клиент, containerd, OCI
9 Docker в продакшене
- Безопасность: non-root, минимум привилегий
Как закалить Docker-образ: запуск от non-root через USER, read-only файловая система, drop capabilities и no-new-privileges — оборонительные практики.
- Надёжность: healthcheck, restart policy, graceful shutdown
Надёжность контейнеров: HEALTHCHECK, restart policy always/unless-stopped, обработка SIGTERM, роль PID 1, зомби-процессы и tini/--init.
- Ресурсы и логи в проде
Лимиты --memory и --cpus, OOM-killer, драйверы логирования json-file и journald, ротация логов и наблюдение через docker stats.
- Конфигурация и секреты
Конфигурация снаружи образа по 12-factor: env против файлов, почему секреты не в образе и не в ENV, docker secrets, тома и .env.
- Безопасность: non-root, минимум привилегий
10 Реестры, безопасность и CI/CD
- Реестры образов: Docker Hub и приватные
Реестр образов Docker: push, pull, login, теги и версионирование, почему latest — антипаттерн, как поднять приватный registry и настроить retention.
- Сканирование уязвимостей образов
Сканирование Docker-образов на уязвимости: trivy и docker scout, откуда берутся CVE, как читать отчёт, обновление базовых образов и зачем нужен SBOM.
- Сборка образов в CI/CD
Сборка Docker-образов в CI/CD: build и push в GitHub Actions и GitLab CI, кэш слоёв в пайплайне, тегирование по коммиту и версии, build matrix под платформы.
- От Compose к оркестрации
От Docker Compose к оркестрации: ограничения одного хоста, Compose в небольшом проде, краткий обзор Docker Swarm и зачем нужен Kubernetes — мостик без глубокого k8s.
- Реестры образов: Docker Hub и приватные