В предишните ни статии разгледахме най-добрите практики за управление на код с Git и GitHub, както и основите на контейнеризацията с Docker за Python приложения. Днес ще надградим тези знания, като се фокусираме върху разгръщането и управлението на Python приложения в продукционна среда, използвайки Docker Compose и Traefik като reverse proxy. Ще покажем как да настроим мащабируема и сигурна архитектура, която позволява лесно разгръщане, актуализиране и наблюдение на вашите приложения. Да започваме!

Предизвикателства при разгръщането на приложения в продукция

Разгръщането на приложения в продукционна среда често представлява множество предизвикателства, особено когато става въпрос за управление на зависимости, конфигурация и мащабиране. Ето някои често срещани проблеми:

  1. Разлики в средите: Приложението може да се държи различно в развойната, тестовата и продукционната среда поради разлики в операционните системи, библиотеките или конфигурацията.
  2. Управление на зависимости: Осигуряването на това, че всички необходими библиотеки и инструменти са налични и в правилните версии може да бъде трудно, особено при множество приложения и сървъри.
  3. Мащабиране: Когато натоварването се увеличи, може да се наложи бързо да се мащабират приложенията, без да се предизвикват прекъсвания или несъответствия.
  4. Сигурност: Излагането на приложения в интернет носи рискове и изисква внимателно управление на сертификати, потребителски достъп и потенциални уязвимости.
  5. Наблюдение и докладване: Получаването на ясна представа за представянето и здравето на приложенията в реално време може да бъде предизвикателство, особено в разпределени среди.

За щастие, съвременните инструменти и практики за контейнеризация и оркестрация, като Docker и Kubernetes, могат значително да опростят много от тези предизвикателства. Нека разгледаме как.

Преглед на нашата архитектура

За целите на тази статия, ще покажем как да разгърнем две Python приложения (уеб приложение и работна опашка) заедно с техните зависимости (база данни и кеш) на един Linux сървър, използвайки Docker Compose. Ще използваме Traefik като reverse proxy за маршрутизиране на заявките към правилните услуги и автоматично управление на Let’s Encrypt SSL сертификати.

Ето обобщение на архитектурата:
Разгръщане и управление на Python приложения

 

Стъпки за реализация

Сега нека преминем през стъпките за настройка на тази архитектура.

1. Инсталиране на Docker и Docker Compose

Първо, трябва да инсталираме Docker и Docker Compose на нашия Linux сървър. Можете да следвате официалните ръководства за вашата дистрибуция от Docker документацията: https://docs.docker.com/engine/install/ и https://docs.docker.com/compose/install/.

2. Структуриране на проекта

Нека създадем директория за нашия проект и поддиректории за всяко приложение:


mkdir my-project && cd my-project
mkdir web worker

3. Създаване на Dockerfile за всяко приложение

За всяко приложение, създайте Dockerfile в съответната му директория, описващ как да се изгради образът. Ето пример Dockerfile за уеб приложение, използващо Python 3.9 и инсталиращо зависимостите от requirements.txt:


# web/Dockerfile
FROM python:3.9

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

CMD ["gunicorn", "app:app", "-w", "4", "-b", "0.0.0.0:5000"]

4. Дефиниране на услугите с Docker Compose

В главната директория на проекта, създайте docker-compose.yml файл, за да опишете всички услуги и техните конфигурации:


# docker-compose.yml
version: '3'

services:

  web:
    build: ./web
    depends_on:
      - db
      - cache
    environment:
      - DATABASE_URL=postgresql://user:password@db/myapp
      - CACHE_URL=redis://cache
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.web.rule=Host(`example.com`)"
      - "traefik.http.services.web.loadbalancer.server.port=5000"
      
  worker:
    build: ./worker
    depends_on:
      - db
      - cache
    environment:
      - DATABASE_URL=postgresql://user:password@db/myapp
      - CACHE_URL=redis://cache

  db:
    image: postgres:13
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=myapp
    volumes:
      - db-data:/var/lib/postgresql/data

  cache:
    image: redis:6

  traefik:
    image: traefik:v2.4
    command: --providers.docker
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/etc/traefik/traefik.toml
      - ./acme.json:/acme.json
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
      - "traefik.http.routers.traefik.service=api@internal"

volumes:
  db-data:

Този файл дефинира пет услуги:

  • web: Уеб приложението, което изграждаме от ./web/Dockerfile. Зависи от db и cache и е достъпно през Traefik при example.com.
  • worker: Приложението за фонова обработка, което изграждаме от ./worker/Dockerfile. Също зависи от db и cache.
  • db: PostgreSQL база данни, използваща официалния образ postgres. Данните се съхраняват в Docker volume db-data.
  • cache: Redis инстанция за кеширане, използваща официалния образ redis.
  • traefik: Traefik reverse proxy, конфигуриран да открива услугите автоматично. Достъпен на портове 80 и 443, с таблото достъпно при traefik.example.com.

5. Конфигурация на Traefik

Създайте traefik.toml файл в главната директория на проекта със следното съдържание:


# traefik.toml
[entryPoints]
  [entryPoints.web]
    address = ":80"
    [entryPoints.web.http]
      [entryPoints.web.http.redirections]
        [entryPoints.web.http.redirections.entryPoint]
          to = "websecure"
          scheme = "https"

  [entryPoints.websecure]
    address = ":443"

[certificatesResolvers.myresolver.acme]
  email = "[email protected]"
  storage = "acme.json"
  [certificatesResolvers.myresolver.acme.httpChallenge]
    entryPoint = "web"

[providers.docker]
  exposedByDefault = false

Този файл конфигурира Traefik да слуша на портове 80 и 443, автоматично пренасочва HTTP към HTTPS и автоматично получава и подновява Let’s Encrypt SSL сертификати.

Не забравяйте да замените [email protected] с вашия имейл адрес.

6. Стартиране на услугите

Най-накрая, стартирайте всички услуги с една команда:


docker-compose up -d

Docker Compose ще изтегли необходимите образи, ще изгради образите според вашите Dockerfile файлове и ще стартира всички контейнери. Вашето приложение сега трябва да е достъпно на дефинираните домейни.

Наблюдение и управление

С Docker Compose лесно можете да наблюдавате и управлявате вашите приложения. Ето някои полезни команди:

  • docker-compose ps: Показва състоянието на всички услуги.
  • docker-compose logs -f: Показва непрекъснат поток от логовете на всички услуги.
  • docker-compose up -d --build: Изгражда и стартира всички услуги, прилагайки промените в Dockerfile или docker-compose.yml.
  • docker-compose down: Спира и премахва всички контейнери и мрежи, създадени от docker-compose up.

Можете също да използвате Traefik таблото за наблюдение на трафика и състоянието на услугите в реално време.

Заключение

В тази статия показахме как да разгърнете Python приложения в продукционна среда с Docker Compose и Traefik. Тази настройка осигурява няколко ключови предимства:

  1. Консистентност на средата: Всички зависимости и конфигурации са опаковани в Docker образи, гарантирайки, че приложението ще работи еднакво навсякъде.
  2. Лесно разполагане: С една команда docker-compose up можете да стартирате или актуализирате всички услуги.
  3. Мащабируемост: Можете лесно да увеличавате броя на контейнерите за всяка услуга според натоварването, като използвате docker-compose scale.
  4. Сигурност: Traefik автоматично управлява SSL сертификатите и пренасочва HTTP към HTTPS.
  5. Наблюдаемост: Docker Compose и Traefik предоставят вградени инструменти за наблюдение на здравето и представянето на приложенията.

Разбира се, това е само един възможен подход и настройките могат да се променят според вашите специфични нужди. За по-сложни сценарии и по-голям мащаб, вероятно ще искате да разгледате пълноценна платформа за оркестрация като Kubernetes.

В бъдещи статии ще разгледаме по-нататъшни теми като непрекъснато разгръщане с CI/CD pipelines, хоризонтално мащабиране с Kubernetes и наблюдение на производителността с инструменти като Prometheus и Grafana.

Последно обновяване: май 22, 2024