Контейнеризация приложения React/Next.js
Напишите многоэтапный Dockerfile для приложения Next.js и запустите его локально с помощью Docker Compose.
«Контейнеризация приложения React/Next.js» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Зачем нужен Docker?
Контейнеры Docker упаковывают приложение вместе с его зависимостями, обеспечивая одинаковое поведение в средах разработки, подготовки и эксплуатации. Один и тот же образ запускается везде.
Dockerfile для обычного React SPA
Сборка в два этапа: Node.js используется для сборки, а Nginx — для раздачи статического результата.
# Stage 1: Build
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Serve with Nginx
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Конфигурация Nginx для маршрутизации SPA
Настройте Nginx так, чтобы он отдавал index.html для всех маршрутов (для поддержки маршрутизации на стороне клиента).
# nginx.conf
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html; # SPA routing
}
location ~* \.(js|css|png|jpg|woff2)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}Dockerfile Next.js в автономном режиме
В Next.js 12 и более поздних версиях поддерживается output: 'standalone', который копирует только необходимые файлы для создания минимального рабочего образа.
// next.config.js
module.exports = { output: 'standalone' };
# Dockerfile (Next.js standalone)
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/public ./public
EXPOSE 3000
CMD ["node", "server.js"].dockerignore
Исключайте ненужные файлы из контекста сборки Docker, чтобы ускорить сборку и уменьшить размер образа.
node_modules
.next
dist
.env*
.git
README.md
*.test.tsСборка и запуск
Соберите образ и запустите его локально.
# Build:
docker build -t my-next-app .
# Run:
docker run -p 3000:3000 -e DATABASE_URL=postgres://... my-next-app
# Check size:
docker images my-next-appDocker Compose для локальной разработки
Используйте Docker Compose, чтобы запускать приложение вместе с его зависимостями (базой данных и Redis) одной командой.
# docker-compose.yml
services:
web:
build: .
ports: ['3000:3000']
environment:
DATABASE_URL: postgresql://postgres:password@db:5432/myapp
depends_on: [db]
db:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: myapp
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:Проверки работоспособности
Добавьте проверку работоспособности в Dockerfile, чтобы оркестраторы знали, когда контейнер готов.
HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost:3000/api/health || exit 1Переменные окружения во время выполнения
Передавайте переменные окружения во время выполнения docker run или через --env-file. Никогда не встраивайте секреты в образ.
docker run -p 3000:3000 \
--env-file .env.production \
my-next-appМультиплатформенная сборка
Собирайте образы для нескольких архитектур CPU (ARM64 для компьютеров Mac с M1 и облачных виртуальных машин, AMD64 для большинства серверов) с помощью Docker Buildx.
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t myregistry/my-next-app:latest \
--push .Быстрая проверка
Какое преимущество даёт использование многоэтапной сборки Docker для приложения React/Next.js?
Итоги
Используйте многоэтапные Dockerfile: Node.js для сборки, Nginx или node:alpine для раздачи. Добавляйте output: 'standalone' в конфигурацию Next.js для создания минимальных образов. Используйте Docker Compose для локальной разработки, передавайте секреты во время выполнения через переменные окружения и собирайте мультиплатформенные образы с помощью Buildx для совместимости с ARM и AMD64.
Часто задаваемые вопросы
Урок «Контейнеризация приложения React/Next.js» бесплатный?
Да — полный текст урока «Контейнеризация приложения React/Next.js» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Контейнеризация приложения React/Next.js»?
Напишите многоэтапный Dockerfile для приложения Next.js и запустите его локально с помощью Docker Compose. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Контейнеризация приложения React/Next.js»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Развёртывание в Vercel: нулевая настройка и предварительные URL
- Размещение React SPA в AWS S3 и CloudFront
- Контейнеризация приложения React/Next.js
- CI/CD React с GitHub Actions