DevOps Docker Kubernetes CI/CD

Docker та Kubernetes: від нуля до продакшну

Практичний гайд: контейнеризація, оркестрація, деплоймент мікросервісів

28 лютого 2026 | 35 хв читання

«Працює на моїй машині» — найпоширеніша відмазка розробників. Docker вирішує цю проблему раз і назавжди. Kubernetes робить так, щоб воно працювало на мільйоні машин.

Docker

Контейнеризація — пакування застосунку з усіма залежностями в ізольований контейнер.

  • Однаковий environment скрізь
  • Легка переносимість
  • Швидкий старт (секунди)
Kubernetes

Оркестрація — автоматичне управління сотнями контейнерів на кластері серверів.

  • Auto-scaling
  • Self-healing
  • Rolling updates

Docker: основи

Встановлення Docker

# Ubuntu/Debian
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

# Перевірка
docker --version
docker run hello-world

Ключові концепції

Концепція Аналогія Опис
Image ISO-образ Шаблон для створення контейнерів (read-only)
Container Віртуальна машина (але легша) Запущений екземпляр image
Dockerfile Рецепт Інструкції для збірки image
Volume Зовнішній диск Персистентне сховище даних
Network Локальна мережа Зв'язок між контейнерами

Dockerfile для Python Flask

# Базовий образ
FROM python:3.11-slim

# Метадані
LABEL maintainer="your@email.com"
LABEL version="1.0"

# Робоча директорія
WORKDIR /app

# Копіюємо requirements окремо (кешування шарів)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копіюємо код
COPY . .

# Змінні середовища
ENV FLASK_APP=app.py
ENV FLASK_ENV=production

# Відкриваємо порт
EXPOSE 5000

# Створюємо non-root користувача (безпека!)
RUN adduser --disabled-password --gecos '' appuser
USER appuser

# Команда запуску
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Збірка та запуск

# Збірка образу
docker build -t my-flask-app:1.0 .

# Запуск контейнера
docker run -d \
  --name flask-container \
  -p 8080:5000 \
  -e DATABASE_URL=postgres://... \
  -v $(pwd)/data:/app/data \
  my-flask-app:1.0

# Перегляд логів
docker logs -f flask-container

# Вхід в контейнер
docker exec -it flask-container /bin/bash

Docker Compose: багатоконтейнерні застосунки

Реальні застосунки складаються з кількох сервісів: backend, frontend, database, cache, etc. Docker Compose дозволяє описати їх всі в одному файлі.

# docker-compose.yml
version: "3.9"

services:
  # Backend API
  api:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
      - REDIS_URL=redis://cache:6379
    depends_on:
      db:
        condition: service_healthy
      cache:
        condition: service_started
    volumes:
      - ./backend:/app
    networks:
      - app-network

  # Frontend (React)
  frontend:
    build: ./frontend
    ports:
      - "3000:80"
    depends_on:
      - api
    networks:
      - app-network

  # PostgreSQL Database
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydb"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - app-network

  # Redis Cache
  cache:
    image: redis:7-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis-data:/data
    networks:
      - app-network

volumes:
  postgres-data:
  redis-data:

networks:
  app-network:
    driver: bridge
# Запуск всього стеку
docker-compose up -d

# Перегляд статусу
docker-compose ps

# Логи конкретного сервісу
docker-compose logs -f api

# Зупинка та видалення
docker-compose down -v

Kubernetes: основи

Docker Compose — для локальної розробки. Kubernetes (K8s) — для продакшну: автоматичне масштабування, самовідновлення, rolling updates.

Локальний Kubernetes

Для навчання: minikube, kind, або Docker Desktop з вбудованим K8s.

Архітектура Kubernetes

Компонент Роль
Pod Найменша одиниця — один або кілька контейнерів
Deployment Керує ReplicaSet'ами, забезпечує rolling updates
Service Стабільна точка доступу до Pod'ів (load balancing)
Ingress HTTP routing, SSL termination
ConfigMap / Secret Конфігурація та секрети
PersistentVolume Персистентне сховище

Deployment маніфест

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-api
  labels:
    app: flask-api
spec:
  replicas: 3
  selector:
    matchLabels:
      app: flask-api
  template:
    metadata:
      labels:
        app: flask-api
    spec:
      containers:
      - name: api
        image: my-registry/flask-api:1.0
        ports:
        - containerPort: 5000
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: url
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 5000
          initialDelaySeconds: 10
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /ready
            port: 5000
          initialDelaySeconds: 5
          periodSeconds: 3

Service та Ingress

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: flask-api-service
spec:
  selector:
    app: flask-api
  ports:
  - port: 80
    targetPort: 5000
  type: ClusterIP

---
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - api.example.com
    secretName: api-tls
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: flask-api-service
            port:
              number: 80

Потрібна допомога з проектом?

Допоможемо з курсовою або дипломною з Docker, Kubernetes та DevOps. Налаштуємо CI/CD, напишемо маніфести та оформимо роботу.

Переглянути всі послуги

Horizontal Pod Autoscaler

Автоматичне масштабування на основі CPU/Memory або кастомних метрик.

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: flask-api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: flask-api
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

Корисні команди kubectl

# Застосування маніфестів
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f ingress.yaml

# Перегляд ресурсів
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get ingress

# Детальна інформація
kubectl describe pod flask-api-xxx

# Логи
kubectl logs -f flask-api-xxx
kubectl logs -f -l app=flask-api --all-containers

# Port forwarding (для тестування)
kubectl port-forward svc/flask-api-service 8080:80

# Exec в pod
kubectl exec -it flask-api-xxx -- /bin/bash

# Масштабування
kubectl scale deployment flask-api --replicas=5

# Rolling update
kubectl set image deployment/flask-api api=my-registry/flask-api:2.0

# Rollback
kubectl rollout undo deployment/flask-api

Ідеї для курсової роботи

Зміст: Автоматизація збірки, тестування та деплою мікросервісного застосунку.

Технології: GitHub Actions, Docker, Kubernetes, ArgoCD

Складність: Середня

Зміст: Впровадження service mesh для mTLS, traffic management, observability.

Технології: Kubernetes, Istio, Kiali, Jaeger

Складність: Висока

Зміст: Повноцінна система моніторингу K8s кластера та застосунків.

Технології: Prometheus, Grafana, Alertmanager, Loki

Складність: Середня

Потрібна допомога з курсовою?

Docker та Kubernetes — must-have скіли для сучасного розробника. Ми допоможемо з налаштуванням, написанням маніфестів та оформленням роботи.

Замовити курсову з DevOps

Потрібна допомога з роботою?

Замовте професійне виконання — без передоплати, оплата після демонстрації!

Курсова з DevOps Практика з програмування