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ПлюсPurpleMax
Материалы
БлогБаза знаний
Документы
Договор офертаПолитика конфиденциальностиПроверка сертификатаМиграция курсовРеферальная программа
Реквизиты
ИП Ларичев Антон АндреевичИНН 773373765379contact@purpleschool.ru

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

  • Курсы
    • FrontendИконка стрелки
    • AI разработкаИконка стрелки
    • BackendИконка стрелки
    • DevOpsИконка стрелки
    • MobileИконка стрелки
    • ТестированиеИконка стрелки
    • Soft-skillsИконка стрелки
    • ДизайнИконка стрелки
    Иконка слояПерейти в каталог курсов
  • Бесплатно
    • Курсы
    • JavaScript Основы разработкиPython Основы PythonCSS CSS FlexboxКарта развитияВопросы для собеседований
    • База знанийИконка стрелки
    • Новостные рассылкиИконка стрелки
  • PurpleSchool — курсы программирования онлайн
    • Подписка
    • 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-разработка едва ли возможна.

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

    Комментарии

    0
    Бесплатный курс

    Учитесь программировать с AI-агентом — бесплатно

    Курс «AI в обучении: OpenCode и skills»: поставите агента и разберёте с ним любую тему — как эту статью.

    opencode

    >объясни этот код и дай задачу

    ◆Читаю src/server.ts…

    ✓Разбор готов: 4 шага

    ✓Задача → practice/01.md

    • Установка и настройка OpenCode
    • Агент и skills на практике
    • 13 уроков, 3 модуля
    Начать бесплатно

    0 ₽ · доступ сразу после регистрации

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

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

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

    Angular

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

    Vue 3 и Pinia

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

    Nuxt

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

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

    Картинка поста Как настроить CI/CD пайплайн с нуля: полное руководство
    Иконка аватараАнтон
    Иконка календаря14 октября 2026
    CI/CDDevOpsGitHub Actions+ 2middleИконка уровня middle

    Как настроить CI/CD пайплайн с нуля: полное руководство

    CI/CD пайплайн с нуля: как собрать рабочий конвейер сборки, тестов и деплоя на примере GitHub Actions и Docker без лишней теории.

    Иконка чипа0
    Иконка глаза259
    Иконка комментариев0
    Картинка поста CLAUDE.md: как написать инструкции для Claude Code
    Иконка аватараАнтон
    Иконка календаря11 октября 2026
    AI-инструментыClaude CodeDevOps+ 1middleИконка уровня middle

    CLAUDE.md: как написать инструкции для Claude Code

    CLAUDE.md — это файл с инструкциями по проекту, который Claude Code читает в начале каждой сессии. Положите его в корень репозитория и опишите внутри, чем проект собирается, чем запускаются тесты и каких соглашений держаться в коде. После этого агент перестанет спрашивать одно и то же в каждом новом диалоге и предлагать решения, которые в вашей кодовой базе не приняты. Формат предельно простой: обычный Markdown, обязательных полей нет, заголовки любые. Дальше — где именно создавать файл и как Claude Code собирает инструкции сразу из нескольких мест, что писать внутрь, как подключать к файлу другие документы и чем CLAUDE.md отличается от AGENTS.md. Одна оговорка перед началом: Claude Code обновляется часто, набор команд и поддерживаемых файлов пополняется. Если какая-то деталь ниже ведёт себя у вас иначе, сверяйтесь с документацией той версии, которая стоит у вас.

    Иконка чипа0
    Иконка глаза887
    Иконка комментариев0
    Иконка аватараАнтон
    Иконка календаря10 октября 2026
    AI-инструментыClaude CodeDevOps+ 2middleИконка уровня middle

    Агенты в OpenCode: как создать своего агента

    Агент в OpenCode — это именованный профиль работы: своя модель, свой системный промпт и свой список разрешённых инструментов. Чтобы создать своего агента, нужно описать его отдельным markdown-файлом в папке `.opencode/agent/` внутри проекта (или в `~/.config/opencode/agent/`, если агент нужен во всех проектах) либо объявить его в блоке `agent` файла `opencode.json`. После этого агент появляется в списке доступных, и его можно вызвать прямо в сессии.

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