Docker

Платформа контейнеризации: упаковывает приложение со всеми зависимостями в образ, который одинаково запускается на любом сервере.

Docker — платформа для запуска приложений в контейнерах. Контейнер — это изолированная среда, в которой лежит приложение вместе со всем, что ему нужно: нужная версия языка, библиотеки, настройки. Один и тот же контейнер одинаково запускается на ноутбуке разработчика, на тестовом и на рабочем сервере. Фраза «у меня работает, а на сервере нет» с Docker почти исчезает. Проект появился в 2013 году и сделал контейнеры массовой технологией.

Основные понятия

  • Образ (image) — неизменяемый шаблон: файлы приложения и окружения, собранные слоями.
  • Контейнер — запущенный экземпляр образа. Из одного образа можно запустить сколько угодно контейнеров.
  • Dockerfile — рецепт сборки образа.
  • Реестр (registry) — хранилище образов: публичный Docker Hub или собственный реестр компании, например Harbor или Nexus.

Пример Dockerfile

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]

Образ берет готовую основу с Python, устанавливает зависимости, копирует код и задает команду запуска. Дальше docker build -t billing . собирает образ, а docker run -p 8000:8000 billing запускает его.

Контейнер и виртуальная машина

Виртуальная машина эмулирует целый компьютер со своей операционной системой — этим занимается гипервизор. Контейнеры делят одно ядро операционной системы, а изоляцию обеспечивают механизмы ядра Linux (namespaces и cgroups). Поэтому контейнер запускается за секунды, весит мегабайты, а не гигабайты, и на одном сервере их помещаются десятки. Плата — изоляция слабее, чем у виртуальной машины.

Где используется

  • Одинаковые среды для разработки, тестов и работы.
  • Доставка приложений. В конвейере CI/CD собирается образ, проходит тесты и выкатывается — без ручной настройки серверов.
  • Локальное окружение. Docker Compose одной командой поднимает приложение вместе с PostgreSQL, Redis и RabbitMQ.
  • Микросервисы — каждый сервис в своем контейнере со своими зависимостями.

Что важно учитывать

Контейнеры не хранят данные: все, что записано внутри, пропадет при пересоздании, поэтому базы данных и файлы выносят во внешние тома. Образы нужно регулярно пересобирать с обновлениями и проверять на уязвимости, а запускать — не от имени администратора. Когда контейнеров становится много и их нужно распределять по серверам, перезапускать и масштабировать, на помощь приходит Kubernetes. Контейнеризация — частый шаг при переносе старых систем на новую инфраструктуру в рамках миграции и импортозамещения.