Что такое Docker и какие задачи он решает

Рейтинг: 57.8% · 13 голосов
Практический курс по Docker: образы, контейнеры, тома, сети, Compose и продакшен. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
Marina_DevOps
Сообщения: 25
Зарегистрирован: 11 май 2026, 05:31

Что такое Docker и какие задачи он решает

Сообщение Marina_DevOps »

АкадемияDocker с нуляГлава 1 из 17
Оглавление курса (17)
  1. Что такое Docker и какие задачи он решает (вы здесь)
  2. Установка Docker и запуск первого контейнера
  3. Образы: слои, теги и реестр Docker Hub
  4. Пишем свой Dockerfile
  5. Тома и хранение данных: volumes и bind mounts
  6. Сети в Docker: связываем контейнеры между собой
  7. Переменные окружения и конфигурация контейнеров
  8. Docker Compose: поднимаем многоконтейнерное приложение
  9. Оптимизация образов: multi-stage сборка, размер и кэш слоёв
  10. Логи, отладка и мониторинг контейнеров
  11. Базовая безопасность контейнеров
  12. Подготовка к продакшену: что важно учесть
  13. Dockerfile глубже: ENTRYPOINT и CMD, HEALTHCHECK, .dockerignore, запуск не от root
  14. Реестры образов: приватные registry, push и pull, теги и digest, imagePullSecrets
  15. BuildKit и buildx: multi-arch сборки, секреты сборки, экспорт кэша
  16. Docker в CI/CD: автосборка, сканирование образов (Trivy, Docker Scout), публикация
  17. Итоговый проект и куда расти: от Dockerfile до прода, обзор оркестрации (Kubernetes, Podman, OCI)
Это первая глава курса, и в ней не будет ни одной команды, которую обязательно выполнять. Сначала разберем, какую боль закрывает Docker и чем контейнер отличается от виртуалки. Установка и первый запуск будут в главе 2, и они пойдут заметно легче, когда в голове есть картинка.

Проблема, с которой все начинается:

Классика жанра. Разработчик пишет сервис на ноутбуке с Ubuntu 24.04 и Python 3.12. На сервере стоит старый Debian с Python 3.9 и другой версией libpq. Локально все работает, на проде падает. Дальше сутки переписки в чате и фраза "у меня же работает".

Корень проблемы в том, что приложение это не только код. Это еще интерпретатор конкретной версии, системные библиотеки, переменные окружения, конфиги. Docker упаковывает все это в один артефакт, образ, и этот образ запускается одинаково на любой машине, где есть Docker. Ноутбук разработчика, CI-сервер, прод, без разницы.

Контейнер это не виртуалка:

Виртуальная машина эмулирует железо и тащит за собой целую гостевую ОС. Гигабайты на диске, десятки секунд на запуск, заметный кусок памяти просто за сам факт существования.

Контейнер устроен иначе. Это обычный процесс на ядре хост-системы, которому средствами Linux ограничили видимость и ресурсы. Изоляцией занимаются namespaces (свое дерево процессов, своя сеть, своя файловая система) и cgroups (лимиты на CPU и память). Гостевой ОС нет, поэтому контейнер стартует за доли секунды и в простое почти ничего не ест.

Отсюда важное следствие: контейнеры работают на ядре Linux. На Windows Docker Desktop запускает их внутри WSL2, это легкая виртуалка с настоящим Linux-ядром, которую поддерживает сама Microsoft. На macOS Docker Desktop точно так же поднимает легкую Linux-виртуалку и гоняет контейнеры внутри нее. В повседневной работе это почти не ощущается, кроме одного места: bind mounts, то есть проброс папки с хоста внутрь контейнера. Файловые операции там ходят через границу виртуалки, и на проектах с тысячами мелких файлов (node_modules, vendor) ввод-вывод проседает в разы по сравнению с нативным Linux. Помните об этом, когда будете мерить производительность: именованные тома живут внутри виртуалки и работают на полной скорости, разницу подробно разберем в главе 5.

Три слова, на которых все держится:

Образ (image), неизменяемый шаблон: файловая система с приложением и зависимостями плюс метаданные. Внутри образ собран из слоев, поэтому общие части скачиваются один раз и переиспользуются, устройство слоев разберем в главе 3. Контейнер, запущенный экземпляр образа, из одного образа можно поднять хоть десять контейнеров. Реестр (registry), хранилище образов, главный публичный называется Docker Hub, про него тоже глава 3. Если знакомы с ООП, аналогия класс/объект здесь работает почти дословно.

Как это выглядит на практике. Поднять nginx без Docker значит ставить пакет, разбираться с конфигами, а потом думать, как его чисто снести:

Код: Выделить всё

sudo apt update
sudo apt install nginx
# плюс конфиги, плюс зачистка хвостов при удалении
С Docker та же задача выглядит так:

Код: Выделить всё

docker run -d -p 8080:80 nginx:1.28
Одна команда скачивает образ и запускает контейнер, веб-сервер доступен на порту 8080. Удаляется он тоже одной командой, и следов в системе не остается.

Еще показательный сценарий: два проекта, одному нужен PostgreSQL 14 (легаси, которое пока не успели мигрировать), другому 17. Без контейнеров держать обе версии на одной машине это боль. С контейнерами:

Код: Выделить всё

docker run -d --name pg17 -e POSTGRES_PASSWORD=secret -p 127.0.0.1:5432:5432 postgres:17
docker run -d --name pg14 -e POSTGRES_PASSWORD=secret -p 127.0.0.1:5433:5432 postgres:14
Две базы живут рядом и друг другу не мешают. Два момента, на которые стоит смотреть уже сейчас. Префикс 127.0.0.1 в пробросе порта не случаен: без него Docker опубликует порт на всех интерфейсах машины, и база с паролем secret будет торчать наружу. Для локальной разработки привязка к localhost обязательная привычка, а такой пароль допустим только потому, что снаружи к базе не достучаться. И про версии: 14 здесь именно легаси-сценарий, ветка доживает последний год поддержки (EOL в ноябре 2026), для новых проектов берите актуальную мажорную версию.

Где Docker дает максимум:

Одинаковое окружение на всех стадиях, от ноутбука до прода. Онбординг новичка за полчаса: склонировал репозиторий, поднял окружение одной командой (этим займемся в главе 8 про Compose). Плотная упаковка сервисов: на VPS за 400-500 рублей в месяц спокойно живут пять-шесть контейнеров, каждый со своим окружением.

Честности ради, Docker не везде уместен. Десктопные GUI-приложения в нем гонять неудобно, Windows-софт это отдельная ниша, а изоляция контейнера слабее, чем у полноценной VM. К безопасности вернемся в главе 11.

Типичные грабли:

Первая ловушка: воспринимать контейнер как маленький сервер и запихивать туда ssh, cron и три сервиса разом. Рабочее правило для старта: один контейнер, один процесс.

Вторая: ждать, что данные переживут контейнер. Не переживут. Контейнер по своей природе одноразовый, удалили и подняли заново. Для данных есть тома, разберем их в главе 5.

Третья: путать образ и контейнер. Удалили контейнер, а образ остался на диске и ест место. Команды очистки увидим в главе 2.

Четвертая: тег latest. Вокруг него живет миф, что это "самая свежая версия в реестре". На деле latest просто тег по умолчанию, Docker подставляет его, когда тег не указан явно. Сам по себе он никуда не двигается: пуш образа с явным тегом, скажем 1.28.1, latest не трогает, он сместится только когда кто-то явно запушит образ под тегом latest. И стабильности он не обещает: это обычный мутабельный тег, сегодня под ним одна версия, завтра мейнтейнер запушил другую, и сборка внезапно ломается. В примерах выше версии указаны явно, и эту привычку лучше завести с первого дня.

Что усвоили:

Docker упаковывает приложение вместе с окружением в образ, а контейнер это изолированный процесс на ядре хоста, а не легкая виртуалка. Главные слова: образ, контейнер, реестр. В следующей главе ставим Docker и запускаем первый контейнер руками.
👍4 ❤️1 🔥 😄 🤔2
✔ Лучший ответ сформирован автоматически — fan_nikita
Marina_DevOps писал(а):На macOS и Windows Docker Desktop незаметно поднимает легкую Linux-виртуалку то есть на маке весь профит по скорости относительно обычной VM теряется? или там одна виртуалка на все контейнеры сразу и это все равно дешевле, чем плодить отдельные VM под каждый сервис?
Перейти к ответу →
Аватара пользователя
fan_nikita
Сообщения: 2
Зарегистрирован: 14 май 2026, 03:43

Re: Что такое Docker и какие задачи он решает

Сообщение fan_nikita »

✔ Лучший ответ — сформирован автоматически
Marina_DevOps писал(а):На macOS и Windows Docker Desktop незаметно поднимает легкую Linux-виртуалку
то есть на маке весь профит по скорости относительно обычной VM теряется? или там одна виртуалка на все контейнеры сразу и это все равно дешевле, чем плодить отдельные VM под каждый сервис?
👍1 ❤️2 🔥 😄 🤔
Аватара пользователя
maker_misha
Сообщения: 1
Зарегистрирован: 19 май 2026, 11:46

Re: Что такое Docker и какие задачи он решает

Сообщение maker_misha »

пример с двумя постгресами прям в точку. у нас легаси на 13 и новый сервис на 16, до этого городил два кластера через pg_ctlcluster и постоянно что-то отваливалось. единственное, обратите внимание что во второй команде -p 5433:5432, я в первый раз ломился на 5432 и минут двадцать тупил, почему коннект идет не в ту базу
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
proxmoxlover
Сообщения: 1
Зарегистрирован: 15 май 2026, 14:09

Re: Что такое Docker и какие задачи он решает

Сообщение proxmoxlover »

а если приложение на .NET Framework и крутится на windows server, докер вообще мимо? слышал что есть windows-контейнеры, но никто вокруг их не использует
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
machismo
Сообщения: 2
Зарегистрирован: 22 май 2026, 19:35

Re: Что такое Docker и какие задачи он решает

Сообщение machismo »

Marina_DevOps писал(а):Рабочее правило для старта: один контейнер, один процесс.
справедливости ради, в проде сплошь и рядом nginx+php-fpm в одном контейнере через supervisor, и живет это годами. но для обучения согласен, лучше не усложнять, иначе отладка превращается в квест
👍 ❤️ 🔥1 😄 🤔
Ответить
Следующая глава →
Установка Docker и запуск первого контейнера

Все главы курса «Docker с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Docker с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей