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

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

Установка Docker и подготовка окружения

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

docker --version

Также рекомендуется установить Docker Compose для управления многоконтейнерными проектами, хотя для простого приложения Fresh это необязательно.

Структура проекта Fresh для контейнеризации

Проект на Fresh обычно имеет следующую структуру:

my-fresh-app/
├─ routes/
├─ islands/
├─ components/
├─ static/
├─ main.ts
├─ import_map.json
├─ deno.json

Главная точка входа — main.ts. Для контейнеризации необходимо обеспечить, чтобы Docker мог запускать Deno и читать все необходимые файлы конфигурации.

Создание Dockerfile

Dockerfile описывает шаги по сборке контейнера:

# Использование официального образа Deno
FROM denoland/deno:latest

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

# Копирование файлов проекта в контейнер
COPY . .

# Разрешение прав на выполнение для Deno
RUN deno cache main.ts

# Открытие порта для приложения
EXPOSE 8000

# Команда для запуска приложения
CMD ["run", "--allow-net", "--allow-read", "main.ts"]

Ключевые моменты:

  • deno cache main.ts позволяет заранее загрузить зависимости и ускорить запуск контейнера.
  • --allow-net и --allow-read задают минимальные необходимые права для работы приложения Fresh.
  • EXPOSE 8000 открывает порт, на котором будет доступно приложение внутри контейнера.

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

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

FROM denoland/deno:alpine-1.37.0 as builder
WORKDIR /app
COPY . .
RUN deno cache main.ts

FROM denoland/deno:alpine-1.37.0
WORKDIR /app
COPY --from=builder /app /app
EXPOSE 8000
CMD ["run", "--allow-net", "--allow-read", "main.ts"]

Это позволяет кэшировать зависимости на этапе сборки и использовать минимальный образ на финальной стадии.

Использование Docker Compose

Для проектов, которые требуют подключения к базе данных или другим сервисам, создается файл docker-compose.yml:

version: '3.9'
services:
  app:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    command: deno run --allow-net --allow-read main.ts

Преимущества Docker Compose:

  • Простое масштабирование сервисов.
  • Автоматическая настройка сетей между контейнерами.
  • Удобное подключение внешних сервисов (например, PostgreSQL, Redis) к приложению Fresh.

Работа с данными и статикой

Для корректной работы статических файлов и сохранения данных рекомендуется использовать тома Docker:

volumes:
  static-data:

В контейнере можно монтировать локальные папки проекта:

volumes:
  - ./static:/app/static

Это позволяет обновлять статические ресурсы без пересборки образа.

Сборка и запуск контейнера

Для сборки образа используется команда:

docker build -t fresh-app .

Запуск контейнера:

docker run -p 8000:8000 fresh-app

С Docker Compose команды упрощаются:

docker-compose up --build

Отладка и мониторинг

Для мониторинга контейнера применяются стандартные Docker-инструменты:

  • docker logs <container_id> — просмотр логов приложения.
  • docker exec -it <container_id> sh — доступ внутрь контейнера для отладки.
  • docker ps — проверка запущенных контейнеров.

Также возможно подключение стандартных инструментов Deno, таких как встроенный инспектор для дебага.

Рекомендации по безопасности

  • Минимизировать права контейнера, предоставляя только необходимые --allow-* флаги.
  • Не хранить чувствительные данные в образе, использовать переменные окружения.
  • Регулярно обновлять базовый образ Deno для исправления уязвимостей.

Контейнеризация позволяет не только изолировать приложение Fresh, но и стандартизировать процесс развертывания на разных окружениях, облегчая CI/CD и масштабирование.