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-разработка едва ли возможна.

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

    Комментарии

    0

    Постройте личный план изучения HTML и CSS - полный курс по вёрстке с нуля до уровня Middle — бесплатно!

    HTML и CSS - полный курс по вёрстке с нуля — часть карты развития Frontend, Mobile

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

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

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

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

    CSS Flexbox

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

    Основы JavaScript

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

    Продвинутый JavaScript

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

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

    Картинка поста CI/CD пайплайн в GitHub Actions для Next.js: полный гайд
    Иконка аватараАнтон
    Иконка календаря18 июня 2026
    GitHub ActionsCI/CDNext.js+ 2middleИконка уровня middle

    CI/CD пайплайн в GitHub Actions для Next.js: полный гайд

    CI/CD пайплайн в GitHub Actions для Next.js: настройка автоматической сборки, тестирования и деплоя приложения с примерами workflow-файлов и разбором типичных ошибок.

    Иконка чипа0
    Иконка глаза238
    Иконка комментариев0
    Картинка поста GraphQL с нуля: схемы, резолверы и интеграция с React
    Иконка аватараАнтон
    Иконка календаря14 июня 2026
    GraphQLReactApollo Client+ 2middleИконка уровня middle

    GraphQL с нуля: схемы, резолверы и интеграция с React

    GraphQL с нуля: разбираем схемы, резолверы и интеграцию с React через Apollo Client. Практические примеры запросов, мутаций и подписок.

    Иконка чипа0
    Иконка глаза317
    Иконка комментариев0
    Картинка поста WebSocket на Node.js: пишем чат и real-time уведомления
    Иконка аватараАнтон
    Иконка календаря09 июня 2026
    WebSocketNode.jsReal-time+ 1middleИконка уровня middle

    WebSocket на Node.js: пишем чат и real-time уведомления

    WebSocket на Node.js: разбираем протокол, пишем чат на ws-сервере и систему real-time уведомлений с reconnect и heartbeat.

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