Перейти к содержимому

1. Что такое Docker

Прежде чем изучать Docker, важно понять, какую именно проблему он решает. История Docker началась с классической фразы, которую слышал каждый разработчик: “Но у меня это работало!”

Представьте типичную ситуацию: разработчик пишет приложение на своём ноутбуке с 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 ❌ Падает

Docker решает эту проблему радикально: приложение упаковывается вместе со всем необходимым окружением в образ (image). Образ содержит:

  • Базовую ОС (обычно Alpine Linux или Ubuntu)
  • Нужную версию рантайма (Node.js, Python, Java)
  • Системные зависимости
  • Код приложения
  • Конфигурацию запуска

Этот образ одинаково работает на ноутбуке разработчика, CI-сервере и продакшене. «Работает у меня» теперь означает «работает везде».

Образ (Image) — неизменяемый шаблон для создания контейнеров. Подобен классу в объектно-ориентированном программировании.

Контейнер (Container) — запущенный экземпляр образа. Изолирован, но может общаться через сеть с другими контейнерами.

Dockerfile — текстовый файл с инструкциями для сборки образа. Описывает шаг за шагом, как создать нужное окружение.

Реестр (Registry) — хранилище образов. Docker Hub — публичный реестр. Компании используют приватные реестры (AWS ECR, GitHub Container Registry).

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:latest

Сегодня Docker используется не только для изоляции окружений. Он является основой:

  • CI/CD пайплайнов — сборка, тестирование и деплой в контейнерах
  • Микросервисной архитектуры — каждый сервис в своём контейнере
  • Kubernetes — оркестрация тысяч контейнеров в продакшене
  • Локальной разработки — единое окружение для всей команды