Docker та Kubernetes: від нуля до продакшну
Практичний гайд: контейнеризація, оркестрація, деплоймент мікросервісів
«Працює на моїй машині» — найпоширеніша відмазка розробників. Docker вирішує цю проблему раз і назавжди. Kubernetes робить так, щоб воно працювало на мільйоні машин.
Контейнеризація — пакування застосунку з усіма залежностями в ізольований контейнер.
- Однаковий environment скрізь
- Легка переносимість
- Швидкий старт (секунди)
Оркестрація — автоматичне управління сотнями контейнерів на кластері серверів.
- 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