arrow_backНазад к полевым заметкам
DEVOPS Опубликовано 9 Aug 2026

Что такое Docker и почему разработчикам его нужно изучить?

Практический разбор Docker для разработчиков: контейнеры против ВМ, основные команды, Dockerfile и как начать использовать его в реальных проектах.

Docker постоянно встречается в объявлениях о вакансиях и инструкциях по настройке, и если вы никогда не работали с контейнерами, это может казаться стеной, которую нужно преодолеть, прежде чем писать полноценный код. На самом деле это не так сложно, если разобраться с терминологией.

Что такое контейнер на самом деле

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

Эта разница — причина, по которой Docker так быстро захватил локальную разработку и CI pipelines. Вы можете запустить базу данных Postgres, кэш Redis и сервер приложения на одном ноутбуке без их прямой установки на вашу ОС.

Основные компоненты, которые вам нужно знать

Есть четыре термина, которые охватывают большую часть того, с чем вы будете иметь дело каждый день:

  • Image: read-only шаблон, построенный из Dockerfile. Думайте о нём как о снимке файловой системы плюс метаданные о том, как его запустить.
  • Container: работающий экземпляр image. Вы можете запускать, останавливать и удалять контейнеры без влияния на image, из которого они были созданы.
  • Dockerfile: текстовый файл с инструкциями по построению image, строка за строкой.
  • Registry: место, где хранятся и откуда загружаются image, чаще всего Docker Hub.

Минимальный Dockerfile для приложения Node.js выглядит так:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Соберите его командой docker build -t my-app . и запустите docker run -p 3000:3000 my-app. Флаг -p пробрасывает порт на вашей машине на порт внутри контейнера, что позволяет вам доступить к приложению из браузера.

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

Несколько команд покрывают большинство повседневных задач:

  • docker ps — список запущенных контейнеров
  • docker ps -a — список всех контейнеров, включая остановленные
  • docker images — список образов на вашей машине
  • docker logs <container> — проверить вывод запущенного или упавшего контейнера
  • docker exec -it <container> sh — открыть shell внутри запущенного контейнера
  • docker rm / docker rmi — удалить контейнеры и образы, которые больше не нужны

Последняя пара важнее, чем думают люди. Docker с удовольствием позволит месту на диске исчезнуть в старых образах и остановленных контейнерах. Периодическое выполнение docker system prune освобождает неожиданно много места.

Почему docker-compose меняет рабочий процесс

Большинство реальных проектов требуют более одного контейнера: сервер приложения, базу данных, может быть, кэш. Писать docker run команды для каждого — надоедает быстро. docker-compose.yml позволяет определить весь stack в одном файле:

services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: devpassword
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

Запустите docker compose up и оба сервиса запустятся вместе, находясь в одной сети, так что web может достичь db по имени сервиса. Это настройка, которую вы увидите почти в каждом README открытого проекта, и её понимание означает, что вы можете клонировать проект и запустить его за минуты вместо того, чтобы вручную устанавливать Postgres, Redis и всё остальное, что нужно приложению.

Где люди спотыкаются в самом начале

Volumes сбивают с толку почти всех поначалу. Без volume всё, что написано внутри контейнера, исчезает при его удалении, что проблематично для баз данных. Секция volumes в файле compose выше связывает именованный volume с путём внутри контейнера, так что данные сохраняются после перезагрузок.

Ещё одна частая ошибка — копирование node_modules или .git в образ потому, что нет файла .dockerignore. Добавьте его, как .gitignore:

node_modules
.git
.env

Это ускоряет сборки и уменьшает размер образов, что важно, когда вы загружаете образы в registry или развёртываете на Kubernetes.

Что изучать после основ

Когда построение и запуск контейнеров станут привычными, следующие полезные навыки — multi-stage builds для более компактных production образов, понимание режимов Docker networking и чтение выхода docker inspect когда что-то не подключается правильно. Ничего сложного, просто непривычно в первый раз.

Для подробнее об упаковке реальных приложений и их подключении к облачным pipeline развёртывания, смотрите разделы DevOps и Cloud на Korra Studio.

Написано с помощью ИИ, проверено и опубликовано Михалом Пильхом (CISSP), Korra Studio.

Готовы пойти дальше?

Это одна заметка из базы знаний Korra Studio — платформа сочетает каждую тему с наставничеством один на один.

Начать бесплатноarrow_forward