Что такое Docker простыми словами: контейнеры, образы и Docker Compose

Dockerfile, docker-compose.yml, volumes, networks — от установки до мультиконтейнерного приложения. С примерами для Python, Node.js и PostgreSQL.

Обложка: Что такое Docker простыми словами: контейнеры, образы и Docker Compose

Docker — слово, которое звучит на каждом втором собеседовании. Его упоминают в вакансиях, обсуждают на митапах и требуют в тестовых заданиях. Но что на самом деле за ним стоит?

Docker — это платформа для контейнеризации приложений. Она позволяет упаковать программу вместе со всеми её зависимостями в изолированный контейнер, который одинаково работает на любом компьютере — от ноутбука разработчика до боевого сервера. Docker выпущен в 2013 году компанией Docker, Inc. и с тех пор стал стандартом индустрии: по данным Stack Overflow Developer Survey 2023, его используют более 52% профессиональных разработчиков.

Ключевые выводы

— Docker упаковывает приложение и все его зависимости в контейнер, который запускается одинаково в любой среде

— Контейнер — это запущенный экземпляр образа, а образ — шаблон для создания контейнеров

— Dockerfile описывает, как собрать образ, а Docker Compose управляет несколькими контейнерами сразу

— Docker потребляет значительно меньше ресурсов, чем виртуальная машина, и запускается за секунды

— Для начала работы достаточно установить Docker Desktop и выполнить одну команду

Зачем нужен Docker — проблема «у меня работает»

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

Docker решает эту проблему радикально. Вместо того чтобы настраивать каждое окружение вручную, вы упаковываете приложение вместе со всем необходимым в контейнер. Этот контейнер работает одинаково везде — на macOS, Windows, Linux, в облаке AWS или на сервере в дата-центре.

Вот что это даёт на практике:

  • Воспроизводимость — «у меня работает» превращается в «работает у всех»
  • Изоляция — приложения не мешают друг другу, каждое живёт в своём контейнере
  • Скорость развёртывания — новый сервер поднимается за секунды, а не за часы
  • Масштабирование — нужно больше мощности? Запустите ещё контейнеров

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

Образ (Image)

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

Образы хранятся в реестрах (registry). Самый популярный — Docker Hub, где доступны тысячи готовых образов: Python, Node.js, PostgreSQL, Nginx и многие другие.

Контейнер (Container)

Контейнер — это запущенный экземпляр образа. Если образ — это класс, то контейнер — это объект. Внутри контейнера работает ваше приложение в изолированном окружении со своей файловой системой, сетью и процессами.

Контейнер можно запустить, остановить, удалить и создать заново из того же образа. Данные внутри контейнера по умолчанию не сохраняются после удаления — для постоянного хранения используются тома (volumes).

Dockerfile

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

Пример Dockerfile для Python-приложения:

			FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
		

Разберём построчно:

  • FROM python:3.12-slim — базовый образ с Python 3.12
  • WORKDIR /app — рабочая директория внутри контейнера
  • COPY requirements.txt . — копирует файл зависимостей
  • RUN pip install — устанавливает зависимости
  • COPY . . — копирует остальной код
  • CMD — команда запуска приложения

Docker Compose

Docker Compose — инструмент для запуска многоконтейнерных приложений. Реальные проекты редко состоят из одного сервиса: обычно есть веб-сервер, база данных, кеш, очередь сообщений. Compose описывает их все в одном файле compose.yml.

Пример — веб-приложение с PostgreSQL и Redis:

			services:
  web:
    build: .
    ports:
      - "8000:8000"
    depends_on:
      - db
      - redis
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
  redis:
    image: redis:7-alpine

volumes:
  pgdata:
		

Одна команда docker compose up поднимает все три сервиса разом. Остановить — docker compose down.

Как начать работу с Docker

  1. Скачайте и установите Docker Desktop (Windows, macOS) или Docker Engine (Linux)
  2. Проверьте установку командой docker --version
  3. Запустите первый контейнер

Вот команда, которая запустит ваш первый контейнер:

			docker run hello-world
		

Docker скачает образ hello-world из Docker Hub и запустит контейнер, который выведет приветственное сообщение. Весь процесс занимает несколько секунд.

Хотите попробовать что-то серьёзнее? Запустите Nginx-сервер одной командой:

			docker run -d -p 8080:80 nginx
		

Откройте http://localhost:8080 в браузере — там будет работающий веб-сервер. Флаг -d запускает контейнер в фоне, а -p 8080:80 пробрасывает порт.

Больше полезных команд для ежедневной работы — в нашей подборке 10 команд Docker, которые должен знать каждый разработчик.

Docker и виртуальная машина — в чём разница

На первый взгляд Docker похож на виртуальную машину (VM): и то, и другое изолирует приложения. Но под капотом — принципиально разные подходы.

Виртуальная машина эмулирует целый компьютер: процессор, память, диск, сетевую карту. Внутри VM работает полноценная операционная система со своим ядром. Это тяжело — VM занимает гигабайты памяти и запускается минутами.

Контейнер Docker использует ядро хост-системы и изолирует только процессы приложения. Это легко — контейнер весит мегабайты и стартует за секунды.

  • Размер: образ Docker — 50–500 МБ, VM — 5–20 ГБ
  • Запуск: контейнер — 1–3 секунды, VM — 1–5 минут
  • Ресурсы: на одном сервере работают десятки контейнеров, но лишь единицы VM
  • Изоляция: VM — полная (отдельное ядро ОС), контейнер — на уровне процессов

Когда использовать что: Docker подходит для микросервисов, CI/CD и быстрого развёртывания. VM — когда нужна полная изоляция на уровне ОС, например для запуска Windows-приложений на Linux-хосте.

Частые вопросы
1
Бесплатен ли Docker?

Docker Engine и Docker CLI — полностью бесплатны и распространяются с открытым исходным кодом. Docker Desktop бесплатен для личного использования, образовательных целей и небольших компаний (до 250 сотрудников и до $10 млн годовой выручки). Крупным организациям потребуется платная подписка от $5 в месяц.

2
Нужен ли Linux для работы с Docker?

Нет. Docker Desktop работает на Windows 10/11 и macOS. На этих системах Docker использует лёгкую виртуальную машину с Linux-ядром, которая запускается автоматически. Для пользователя всё прозрачно — команды одинаковы на всех платформах.

3
Чем Docker отличается от Kubernetes?

Docker — это инструмент для создания и запуска контейнеров. Kubernetes (K8s) — это система оркестрации, которая управляет множеством контейнеров в продакшене: распределяет нагрузку, перезапускает упавшие контейнеры, масштабирует сервисы. Docker создаёт контейнеры, Kubernetes ими управляет.

4
Можно ли использовать Docker в продакшене?

Да, и это стандартная практика. Docker используют Netflix, Spotify, PayPal и тысячи других компаний. Для продакшена обычно применяют Docker в связке с оркестратором — Kubernetes или Docker Swarm — для обеспечения отказоустойчивости и автоматического масштабирования.

5
Какие есть альтернативы Docker?

Основные альтернативы: Podman — совместимый с Docker инструмент от Red Hat, не требующий демона с root-правами. containerd — низкоуровневый runtime, который Docker сам использует под капотом. LXC — контейнеры на уровне ОС, ближе к виртуальным машинам. Для большинства задач Docker остаётся оптимальным выбором благодаря экосистеме и документации.

Заключение

Docker изменил подход к разработке и развёртыванию приложений. Вместо многочасовой настройки серверов — одна команда. Вместо «у меня работает» — гарантированная воспроизводимость на любой машине.

Начните с малого: установите Docker, запустите docker run hello-world, а затем контейнеризируйте свой pet-проект. Когда освоите основы — переходите к Docker Compose для многосервисных приложений.

Docker — ключевой строительный блок современной DevOps-экосистемы. Контейнеры отлично сочетаются с микросервисной архитектурой — каждый сервис упаковывается в отдельный образ и деплоится независимо. Когда сервисов становится много, ими начинает управлять Kubernetes. А автоматизировать сборку и доставку образов поможет CI/CD — связка Docker + CI/CD является стандартом современной разработки.

Если хотите понять, какое место Docker занимает во всей цепочке, посмотрите план обучения DevOps-инженера. Там Docker показан как мост между Git, CI/CD, инфраструктурой и Kubernetes.

Рекомендуем