Kontajnery riešia večný problém "u mňa to funguje". Balíte aplikáciu spolu so všetkými závislosťami.

Čo je Docker?

Docker je platforma pre vytváranie, distribúciu a spúšťanie kontajnerov.

Základné pojmy

  • Image - šablóna pre kontajner (read-only)
  • Container - bežiaca inštancia image
  • Dockerfile - recept na vytvorenie image
  • Registry - úložisko images (Docker Hub)

Prvý Dockerfile

# Base image
FROM node:20-alpine

# Working directory
WORKDIR /app

# Copy package files
COPY package*.json ./

# Install dependencies
RUN npm ci --only=production

# Copy source code
COPY . .

# Build application
RUN npm run build

# Expose port
EXPOSE 3000

# Start command
CMD ["npm", "start"]

Základné príkazy

# Build image
docker build -t myapp:1.0 .

# Run container
docker run -d -p 3000:3000 myapp:1.0

# List containers
docker ps

# View logs
docker logs <container_id>

# Stop container
docker stop <container_id>

Docker Compose

Pre multi-container aplikácie:

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://db:5432/myapp
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_PASSWORD=secret

volumes:
  postgres_data:
# Start all services
docker compose up -d

# Stop all services
docker compose down

Kubernetes (K8s)

Kubernetes je orchestrátor pre kontajnery - spravuje nasadenie, škálovanie a samoopravovanie.

Kedy potrebujete K8s?

  • Veľa mikroslužieb
  • Potrebujete auto-scaling
  • High availability je kritická
  • Máte dedikovaný ops tím

Základné objekty

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 3000
  type: LoadBalancer

Alternatívy pre menšie projekty

  • Docker Compose - lokálny vývoj a malé nasadenia
  • Railway, Render, Fly.io - managed platformy
  • AWS ECS, Google Cloud Run - container-as-a-service

Best practices

  1. Malé images - používajte alpine verzie
  2. Multi-stage builds - oddeľte build a runtime
  3. Non-root user - bezpečnosť
  4. Health checks - pre automatické reštarty
  5. .dockerignore - vynechajte nepotrebné súbory

Záver

Začnite s Dockerom pre lokálny vývoj. Kubernetes pridajte až keď narazíte na limity jednoduchších riešení.