1. Что такое Docker
Прежде чем изучать Docker, важно понять, какую именно проблему он решает. История Docker началась с классической фразы, которую слышал каждый разработчик: “Но у меня это работало!”
Проблема: “Works on My Machine”
Заголовок раздела «Проблема: “Works on My Machine”»Представьте типичную ситуацию: разработчик пишет приложение на своём ноутбуке с macOS, Node.js 20, PostgreSQL 15 и определёнными переменными окружения. Всё работает отлично. Он передаёт код тестировщику — и тут начинается хаос.
Тестировщик использует Windows, другую версию Node.js, а PostgreSQL и вовсе не установлен. Приложение падает с ошибками. После долгой отладки выясняется, что виновата разница в версиях библиотек. Наконец код попадает в продакшен на Linux-сервер — и снова проблемы: другая версия Python для скриптов, иначе настроена сеть, нет нужных системных зависимостей.
Почему возникает эта проблема?
Заголовок раздела «Почему возникает эта проблема?»Приложения зависят от окружения: операционной системы, версий рантаймов, системных библиотек, переменных окружения и конфигурации сети. Традиционно каждая машина настраивалась вручную — с помощью документации, скриптов или «магии DevOps». Это привело к понятию «snowflake servers» (серверы-снежинки): каждый сервер уникален, и никто точно не знает, что на нём установлено.
Разработчик: Node 20, npm 10, macOS 14 ✅ РаботаетТестировщик: Node 18, npm 9, Windows 11 ❌ ОшибкиСтейджинг: Node 16, npm 8, Ubuntu 20.04 ⚠️ ЧастичноПродакшен: Node 14, npm 6, CentOS 7 ❌ ПадаетРешение: “Build Once, Run Anywhere”
Заголовок раздела «Решение: “Build Once, Run Anywhere”»Docker решает эту проблему радикально: приложение упаковывается вместе со всем необходимым окружением в образ (image). Образ содержит:
- Базовую ОС (обычно Alpine Linux или Ubuntu)
- Нужную версию рантайма (Node.js, Python, Java)
- Системные зависимости
- Код приложения
- Конфигурацию запуска
Этот образ одинаково работает на ноутбуке разработчика, CI-сервере и продакшене. «Работает у меня» теперь означает «работает везде».
Ключевые концепции Docker
Заголовок раздела «Ключевые концепции Docker»Образ (Image) — неизменяемый шаблон для создания контейнеров. Подобен классу в объектно-ориентированном программировании.
Контейнер (Container) — запущенный экземпляр образа. Изолирован, но может общаться через сеть с другими контейнерами.
Dockerfile — текстовый файл с инструкциями для сборки образа. Описывает шаг за шагом, как создать нужное окружение.
Реестр (Registry) — хранилище образов. Docker Hub — публичный реестр. Компании используют приватные реестры (AWS ECR, GitHub Container Registry).
Как Docker достигает изоляции
Заголовок раздела «Как Docker достигает изоляции»Docker использует возможности Linux-ядра:
- namespaces — изолируют процессы, сеть, файловую систему
- cgroups — ограничивают ресурсы (CPU, память)
- Union File System — позволяет образам состоять из слоёв
# Запустить контейнер с Node.js 20 (независимо от хостовой системы)docker run -it node:20-alpine node --version# v20.x.x — всегда одинаково!
# Запустить приложение в контейнереdocker run -p 3000:3000 myapp:latestDocker в современной разработке
Заголовок раздела «Docker в современной разработке»Сегодня Docker используется не только для изоляции окружений. Он является основой:
- CI/CD пайплайнов — сборка, тестирование и деплой в контейнерах
- Микросервисной архитектуры — каждый сервис в своём контейнере
- Kubernetes — оркестрация тысяч контейнеров в продакшене
- Локальной разработки — единое окружение для всей команды