Docker контейнеризация

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

Ключевые концепции Docker:

  • Образ (Image): шаблон, содержащий всё необходимое для запуска приложения — код, зависимости, настройки.
  • Контейнер (Container): запущенный экземпляр образа, изолированный от других процессов.
  • Dockerfile: текстовый файл с инструкциями для сборки образа.
  • Docker Hub: публичный реестр образов, позволяющий хранить и распространять их.

Установка и базовая настройка

Для работы с Docker необходимо установить Docker Engine и Docker CLI. После установки проверка корректной работы выполняется командой:

docker --version
docker run hello-world

Команда hello-world запускает контейнер, который выводит тестовое сообщение, подтверждая корректность установки.

Создание Dockerfile для Stencil

Stencil — это фреймворк для создания веб-компонентов на JavaScript. Для контейнеризации приложения на Stencil создаётся Dockerfile следующего вида:

# Используем официальный Node.js образ
FROM node:20-alpine

# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app

# Копируем package.json и package-lock.json для установки зависимостей
COPY package*.json ./

# Устанавливаем зависимости
RUN npm ci

# Копируем весь проект внутрь контейнера
COPY . .

# Собираем Stencil приложение
RUN npm run build

# Открываем порт для доступа к приложению
EXPOSE 3333

# Команда для запуска приложения
CMD ["npm", "start"]

Разбор ключевых этапов:

  • FROM node:20-alpine — лёгкий образ Node.js на базе Alpine Linux.
  • WORKDIR /app — задаёт рабочую директорию внутри контейнера.
  • COPY package*.json ./ и RUN npm ci — ускоряет сборку за счёт кэширования слоёв Docker.
  • COPY . . — переносит исходный код.
  • RUN npm run build — сборка проекта Stencil.
  • EXPOSE 3333 — открытие порта для доступа к разработанному приложению.
  • CMD ["npm", "start"] — команда запуска контейнера.

Docker Compose для Stencil

Для управления многоконтейнерными приложениями удобно использовать Docker Compose. Пример docker-compose.yml для проекта Stencil:

version: '3.9'

services:
  stencil-app:
    build: .
    ports:
      - "3333:3333"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      NODE_ENV: development

Пояснения:

  • build: . — строим образ из текущей директории.
  • ports: "3333:3333" — пробрасываем порт контейнера наружу.
  • volumes — монтируем код проекта для горячей перезагрузки при изменениях.
  • environment — задаёт переменные окружения.

Оптимизация Docker-образов

Контейнеры Stencil можно оптимизировать для продакшена:

  1. Многоступенчатая сборка (Multi-stage build): уменьшает размер итогового образа, оставляя только необходимые для запуска файлы.
# Этап сборки
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Этап запуска
FROM nginx:alpine
COPY --from=builder /app/www /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  1. Кэширование слоёв: копирование зависимостей отдельно от исходного кода позволяет ускорять повторные сборки.
  2. Использование лёгких базовых образов: alpine уменьшает размер контейнера в несколько раз по сравнению с полной версией Linux.

Работа с данными и персистентность

Stencil-приложения обычно являются фронтендом, но иногда требуется хранение данных. В Docker это реализуется с помощью volumes:

volumes:
  stencil_data:

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

Управление контейнерами

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

docker build -t stencil-app .
docker run -p 3333:3333 stencil-app
docker ps
docker logs <container_id>
docker stop <container_id>
docker rm <container_id>
  • docker build — сборка образа.
  • docker run — запуск контейнера.
  • docker ps — просмотр запущенных контейнеров.
  • docker logs — просмотр логов приложения.
  • docker stop и docker rm — остановка и удаление контейнера.

Автоматизация и CI/CD

Docker позволяет интегрировать Stencil-приложения в CI/CD пайплайны:

  • GitHub Actions или GitLab CI для сборки образа при пуше в репозиторий.
  • Публикация образов в Docker Hub или приватные реестры.
  • Автоматическое развертывание на сервер или в Kubernetes кластере.

Безопасность и рекомендации

  • Минимизировать права контейнера, запускать от непривилегированного пользователя.
  • Использовать официальные образы Node.js и Alpine.
  • Ограничивать ресурсы контейнера (memory, cpu) при продакшене.
  • Регулярно обновлять образы для устранения уязвимостей.

Контейнеризация Stencil-приложений с помощью Docker позволяет стандартизировать среду разработки, ускоряет деплой и упрощает масштабирование приложений.