Docker для разработчиков: образы, контейнеры и Compose

DevOps2026-10-06TryQuickToolBox

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

Что такое Docker?

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

Образы vs. контейнеры

Образ — это шаблон только для чтения с инструкциями для создания контейнера. Это как снимок вашего приложения и его окружения. Контейнер — это запускаемый экземпляр образа. Вы можете создавать, запускать, останавливать, перемещать или удалять контейнеры с помощью Docker API или CLI.

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

Сборка образа с помощью Dockerfile

Dockerfile — это текстовый файл с инструкциями для сборки образа. Вот простой пример для приложения на Node.js:

# Use an official Node.js runtime as a parent image
FROM node:18-alpine

# Set the working directory
WORKDIR /app

# Copy package.json and package-lock.json
COPY package*.json ./

# Install dependencies
RUN npm install

# Copy the rest of the application code
COPY . .

# Expose the port the app runs on
EXPOSE 3000

# Define the command to run the app
CMD ["node", "server.js"]

Чтобы собрать образ, выполните:

docker build -t my-node-app .

Флаг -t присваивает образу имя (my-node-app). Точка . в конце указывает контекст сборки (текущий каталог).

Запуск контейнеров

Когда у вас есть образ, вы можете запустить контейнер:

docker run -p 3000:3000 -d my-node-app

Это сопоставляет порт 3000 на вашем хосте с портом 3000 в контейнере и запускает его в фоновом режиме (-d).

Основные команды:

Управление данными с помощью томов

Контейнеры эфемерны; при их удалении данные теряются. Для сохранения данных используйте тома. Том — это каталог вне файловой системы контейнера, управляемый Docker.

docker run -v my_volume:/app/data my-node-app

Вы также можете смонтировать каталог хоста (bind mount) для разработки:

docker run -v $(pwd):/app my-node-app

Docker Compose: многоконтейнерные приложения

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

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:password@db:5432/mydb
    depends_on:
      - db
  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
volumes:
  postgres_data:

Запустите весь стек с помощью:

docker compose up -d

Это собирает сервис web, загружает образ Postgres, создаёт сеть и запускает оба контейнера. Директива depends_on гарантирует, что база данных запустится до веб-сервиса.

Чтобы остановить и удалить контейнеры, сети и тома:

docker compose down -v

Лучшие практики использования Docker в разработке

Сравнение: Docker vs. виртуальные машины

Аспект Docker-контейнеры Виртуальные машины
Время запуска Секунды Минуты
Использование ресурсов Лёгкое (общее ядро ОС) Тяжёлое (полная ОС для каждой ВМ)
Изоляция На уровне процессов На уровне оборудования
Портируемость Высокая (работает везде, где работает Docker) Ограничена совместимостью гипервизора

FAQ

В чём разница между образом и контейнером?

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

Когда следует использовать Docker Compose?

Используйте Docker Compose, когда ваше приложение состоит из нескольких сервисов (например, веб-сервер, база данных, кэш), которые должны работать вместе. Это упрощает оркестрацию для разработки и тестирования.

Как сохранить данные в Docker?

Используйте тома для сохранения данных вне файловой системы контейнера. Тома управляются Docker и могут совместно использоваться контейнерами. Bind mounts также можно использовать для монтирования каталогов хоста.

Готовы контейнеризировать ваш следующий проект? Начните с написания Dockerfile для простого приложения, затем постепенно добавляйте сервисы с помощью Docker Compose. Для получения дополнительных инструментов разработчика ознакомьтесь с нашим JSON Formatter для валидации и форматирования ваших конфигурационных файлов.