PurpleSchool — курсы программирования онлайн
  • Пути
    • Frontend React разработчик
    • Frontend Vue разработчик
    • Backend разработчик Node.js
    • Fullstack разработчик React / Node.js
    • Mobile разработчик React Native
    • Backend разработчик Golang
    • Devops инженер
    • Backend разработчик Python
  • AI для кодаНовое
  • О нас
    • Отзывы
    • Реферальная программа
    • О компании
    • Контакты
  • Иконка открытия меню
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
PurpleSchool — платформа бесплатных roadmap и курсов для разработчиков
ютуб иконка
Telegram иконка
VK иконка
VK иконка
Курсы
ГлавнаяКаталог курсовFrontendBackendFullstack
Практика
КарьераПроектыPurpleПлюс
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

PurpleSchool © 2020 -2026 Все права защищены

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • AI для кодаНовое
    • Сообщество
    • PurpleПлюс
    • AI Собеседование
    • AI тренажёр
    • Проекты
    Главная
    Сообщество
    Основы Docker для разработчика: контейнеры, образы и тома

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

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

    Антон Ларичев

    Иконка календаря20 июня 2026
    DockerDevOpsКонтейнеризацияBackendjuniorИконка уровня junior
    Картинка поста Основы Docker для разработчика: контейнеры, образы и тома

    Введение

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

    В этой статье разберём три ключевых понятия: образы (images), контейнеры (containers) и тома (volumes). Покажем команды и Dockerfile на практических примерах.

    Образы: шаблон для запуска

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

    Простой Dockerfile для Node.js приложения:

    # Базовый образ с предустановленным Node.js
    FROM node:20-alpine
    
    # Рабочая директория внутри контейнера
    WORKDIR /app
    
    # Сначала копируем только манифесты — кэш слоя сохранится,
    # пока package.json не изменится
    COPY package*.json ./
    RUN npm ci --omit=dev
    
    # Теперь копируем исходники
    COPY . .
    
    # Порт, который слушает приложение
    EXPOSE 3000
    
    # Команда запуска при старте контейнера
    CMD ["node", "server.js"]
    

    Собираем образ и смотрим список локальных образов:

    # Тег формата имя:версия
    docker build -t my-app:1.0 .
    
    # Просмотр локальных образов
    docker images
    

    Для минимизации размера используйте alpine-варианты базовых образов и multi-stage сборку, когда нужны разные окружения для сборки и рантайма.

    Multi-stage сборка

    # Этап сборки: устанавливаем dev-зависимости и компилируем TypeScript
    FROM node:20-alpine AS builder
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci
    COPY . .
    RUN npm run build
    
    # Финальный этап: только runtime, без исходников и dev-зависимостей
    FROM node:20-alpine
    WORKDIR /app
    COPY --from=builder /app/dist ./dist
    COPY --from=builder /app/node_modules ./node_modules
    CMD ["node", "dist/server.js"]
    

    Такой подход сокращает размер итогового образа в разы и убирает лишние инструменты из прод-окружения.

    Контейнеры: запущенный экземпляр

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

    Запуск контейнера в фоне с пробросом портов:

    # -d — detached режим, контейнер работает в фоне
    # -p — проброс портов host:container
    # --name — человекочитаемое имя
    docker run -d -p 3000:3000 --name api my-app:1.0
    
    # Логи контейнера
    docker logs -f api
    
    # Войти внутрь работающего контейнера
    docker exec -it api sh
    
    # Остановить и удалить
    docker stop api && docker rm api
    

    Переменные окружения передаются через -e или файл --env-file:

    docker run -d \
      -e NODE_ENV=production \
      -e DATABASE_URL=postgres://user:pass@db:5432/app \
      --name api my-app:1.0
    

    Тома: постоянные данные

    Том (volume) — механизм хранения данных вне жизненного цикла контейнера. Тома нужны базам данных, загруженным файлам и любому состоянию, которое должно пережить перезапуск.

    Есть три варианта монтирования:

    • Named volume — управляется Docker, хранится в /var/lib/docker/volumes.
    • Bind mount — конкретная директория с хоста, удобно для разработки.
    • tmpfs — временное хранилище в оперативной памяти.

    Пример с PostgreSQL и именованным томом:

    # Создаём том явно
    docker volume create pgdata
    
    # Монтируем том в директорию данных Postgres
    docker run -d \
      --name db \
      -e POSTGRES_PASSWORD=secret \
      -v pgdata:/var/lib/postgresql/data \
      -p 5432:5432 \
      postgres:16-alpine
    

    Для локальной разработки удобен bind mount — изменения в коде сразу видны контейнеру:

    # Текущая директория монтируется в /app
    docker run -d \
      -p 3000:3000 \
      -v $(pwd):/app \
      -v /app/node_modules \
      --name dev-api my-app:1.0
    

    Анонимный том /app/node_modules защищает зависимости контейнера от перезаписи пустой локальной папкой.

    Частые ошибки

    • Запись в файловую систему контейнера без тома. После docker rm данные исчезают. Любое постоянное состояние — в volume.
    • COPY . . до установки зависимостей. Любая правка кода сбрасывает кэш npm ci, сборка становится медленной. Сначала копируйте манифесты.
    • Запуск под root. По умолчанию процессы в контейнере идут от root, что увеличивает риск при побеге из контейнера. Добавляйте USER node или собственного пользователя.
    • Жирные образы. Использование ubuntu вместо alpine или distroless без причины раздувает образ на сотни мегабайт.
    • Хардкод секретов в Dockerfile. Значения попадают в слои образа. Используйте переменные окружения, BuildKit secrets или внешние хранилища.
    • Игнорирование .dockerignore. Без него в образ попадают node_modules, .git и локальные конфиги, что ломает сборку и раздувает контекст.

    Заключение

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

    Следующие шаги: освойте docker compose для оркестрации нескольких сервисов, настройте multi-stage сборку для прод-образов и подключите сканер уязвимостей вроде Trivy в CI. Docker — это базовый навык, без которого современная backend-разработка едва ли возможна.

    Иконка глаза288

    Комментарии

    0

    Постройте личный план изучения Nuxt - fullstack Vue фреймворк до уровня Middle — бесплатно!

    Nuxt - fullstack Vue фреймворк — часть карты развития Frontend

    • step100+ шагов развития
    • lessons30 бесплатных лекций
    • lessons300 бонусных рублей на счет

    Бесплатные лекции

    Лучшие курсы по теме

    изображение курса

    Основы разработки

    Антон Ларичев
    Гарантия
    Бонусы
    иконка звёздочки рейтинга5.0
    бесплатно
    Подробнее
    изображение курса

    Angular

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.5
    3 999 ₽ 6 990 ₽
    Подробнее
    изображение курса

    Feature-Sliced Design

    Антон Ларичев
    AI-тренажерыAI-тренажеры
    Практика в студииПрактика в студии
    Гарантия
    Бонусы
    иконка звёздочки рейтинга4.6
    3 999 ₽ 6 990 ₽
    Подробнее

    Похожие статьи

    Картинка поста CI/CD с GitHub Actions: автоматизация деплоя для начинающих
    Иконка аватараАнтон
    Иконка календаря03 июля 2026
    CI/CDGitHub ActionsDevOps+ 2juniorИконка уровня junior

    CI/CD с GitHub Actions: автоматизация деплоя для начинающих

    CI/CD с GitHub Actions: пошаговая настройка pipeline для автоматического тестирования и деплоя Node.js-приложений без сторонних сервисов.

    Иконка чипа0
    Иконка глаза236
    Иконка комментариев0
    Картинка поста React useState и useEffect: полное руководство 2024
    Иконка аватараАнтон
    Иконка календаря29 июля 2026
    ReactuseStateuseEffect+ 3juniorИконка уровня junior

    React useState и useEffect: полное руководство 2024

    Разбираем useState и useEffect с нуля: как управлять состоянием и побочными эффектами в React-компонентах с реальными примерами.

    Иконка чипа0
    Иконка глаза177
    Иконка комментариев0
    Картинка поста Docker для разработчиков: с чего начать и как применять
    Иконка аватараАнтон
    Иконка календаря21 июля 2026
    dockerdevopsконтейнеры+ 3juniorИконка уровня junior

    Docker для разработчиков: с чего начать и как применять

    Docker — инструмент контейнеризации, который решает проблему «у меня работает». Установка, первый контейнер, Dockerfile и docker-compose с нуля.

    Иконка чипа0
    Иконка глаза411
    Иконка комментариев0
    Иконка чипа0