Plan zajęć: Docker dla aplikacji frontendowych

Plan zajęć: Docker dla aplikacji frontendowych

Informacje ogólne

Cele zajęć

Plan szczegółowy

1. Wprowadzenie do Dockera (30 minut)

2. Tworzenie obrazów Dockera dla aplikacji frontendowych (45 minut)

3. Implementacja zasad 12-factor app w kontekście Dockera (30 minut)

4. Aplikacja fullstack: Frontend + Backend w kontenerach (45 minut)

5. Docker Compose: Orkiestracja wielokontenerowa (30 minut)

6. Wdrażanie aplikacji na platformy chmurowe (30 minut)

7. Praktyczny projekt końcowy i podsumowanie (30 minut)

Materiały praktyczne

Przykładowa aplikacja React z konfiguracją przez zmienne środowiskowe

Struktura projektu

frontend/
  ├── Dockerfile
  ├── .dockerignore
  ├── .env.example
  ├── package.json
  ├── tsconfig.json
  ├── public/
  └── src/
      ├── App.tsx
      ├── config.ts
      ├── components/
      └── ...

Dockerfile dla frontendu

# Etap budowania
FROM node:18-alpine AS build

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

# Etap produkcyjny
FROM nginx:alpine

# Kopiowanie plików konfiguracyjnych nginx
COPY --from=build /app/nginx.conf /etc/nginx/conf.d/default.conf

# Kopiowanie zbudowanej aplikacji
COPY --from=build /app/build /usr/share/nginx/html

# Skrypt startowy do podmiany zmiennych środowiskowych
COPY --from=build /app/env.sh /usr/share/nginx/html/env.sh
RUN chmod +x /usr/share/nginx/html/env.sh

# Podmiana zmiennych środowiskowych podczas startu kontenera
CMD ["/bin/sh", "-c", "/usr/share/nginx/html/env.sh && nginx -g \"daemon off;\""]

env.sh dla wstrzykiwania zmiennych środowiskowych

#!/bin/sh

# Plik z konfiguracją JS, który będzie modyfikowany
ENV_FILE=/usr/share/nginx/html/config.js

# Zastąp placeholdery rzeczywistymi wartościami ze zmiennych środowiskowych
echo "window.env = {" > $ENV_FILE
echo "  API_URL: \"$API_URL\"," >> $ENV_FILE
echo "  ENVIRONMENT: \"$ENVIRONMENT\"," >> $ENV_FILE
echo "  APP_TITLE: \"$APP_TITLE\"," >> $ENV_FILE
echo "};" >> $ENV_FILE

exec "$@"

Przykładowy backend w Express.js

Struktura projektu

backend/
  ├── Dockerfile
  ├── .dockerignore
  ├── package.json
  ├── tsconfig.json
  └── src/
      ├── index.ts
      ├── config.ts
      ├── routes/
      └── ...

Dockerfile dla backendu

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

EXPOSE 3000

CMD ["node", "dist/index.js"]

Konfiguracja backend z 12-factor (config.ts)

export const config = {
  port: parseInt(process.env.PORT || '3000', 10),
  databaseUrl: process.env.DATABASE_URL || 'mongodb://localhost:27017/app',
  environment: process.env.NODE_ENV || 'development',
  logLevel: process.env.LOG_LEVEL || 'info',
  corsOrigin: process.env.CORS_ORIGIN || '*',
  jwtSecret: process.env.JWT_SECRET || 'default-dev-secret',
};

Docker Compose dla całej aplikacji

version: '3.8'

services:
  frontend:
    build: ./frontend
    ports:
      - "80:80"
    environment:
      - API_URL=http://localhost:3000
      - ENVIRONMENT=development
      - APP_TITLE=My App - Development
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - PORT=3000
      - DATABASE_URL=mongodb://db:27017/app
      - NODE_ENV=development
      - CORS_ORIGIN=http://localhost
    depends_on:
      - db

  db:
    image: mongo:5
    ports:
      - "27017:27017"
    volumes:
      - mongo-data:/data/db

volumes:
  mongo-data:

Wdrożenie na Render.com (darmowy plan)

  1. Utwórz konto na Render.com
  2. Połącz swoje repozytorium GitHub
  3. Utwórz nową usługę web service dla backendu:
    • Wybierz repozytorium
    • Ustaw katalog główny na backend
    • Ustaw komendę budowania: npm install && npm run build
    • Ustaw komendę startową: node dist/index.js
    • Skonfiguruj zmienne środowiskowe
  4. Utwórz nową usługę Static Site dla frontendu:
    • Wybierz repozytorium
    • Ustaw katalog główny na frontend
    • Ustaw komendę budowania: npm install && npm run build
    • Ustaw katalog publikacji: build
    • Skonfiguruj zmienne środowiskowe, w tym URL do backendu
  5. Opcjonalnie: Skonfiguruj bazę danych (MongoDB Atlas - darmowy plan)

Alternatywne platformy wdrożeniowe:

  1. DigitalOcean App Platform:
    • Koszt: od $5/msc za kontener
    • Prosta konfiguracja przez panel
    • Łatwa integracja z GitHub
  2. Railway:
    • Darmowy plan dla projektów niekomercyjnych
    • Limit czasu działania: 500 godzin miesięcznie
    • Intuicyjny interfejs
  3. Fly.io:
    • Darmowy plan obejmuje 3 małe maszyny
    • Globalna dystrybucja

Zadania praktyczne do wykonania przez studentów

  1. Utworzenie pliku Dockerfile dla aplikacji React
  2. Implementacja mechanizmu podmiennych zmiennych środowiskowych
  3. Utworzenie backendu w Express.js skonfigurowanego zgodnie z 12-factor app
  4. Przygotowanie pliku docker-compose.yml
  5. Wdrożenie aplikacji na wybraną platformę

Materiały dodatkowe