В предишните ни статии разгледахме най-добрите практики за управление на код с Git и GitHub, както и основите на контейнеризацията с Docker за Python приложения. Днес ще надградим тези знания, като се фокусираме върху разгръщането и управлението на Python приложения в продукционна среда, използвайки Docker Compose и Traefik като reverse proxy. Ще покажем как да настроим мащабируема и сигурна архитектура, която позволява лесно разгръщане, актуализиране и наблюдение на вашите приложения. Да започваме!
Предизвикателства при разгръщането на приложения в продукция
Разгръщането на приложения в продукционна среда често представлява множество предизвикателства, особено когато става въпрос за управление на зависимости, конфигурация и мащабиране. Ето някои често срещани проблеми:
- Разлики в средите: Приложението може да се държи различно в развойната, тестовата и продукционната среда поради разлики в операционните системи, библиотеките или конфигурацията.
- Управление на зависимости: Осигуряването на това, че всички необходими библиотеки и инструменти са налични и в правилните версии може да бъде трудно, особено при множество приложения и сървъри.
- Мащабиране: Когато натоварването се увеличи, може да се наложи бързо да се мащабират приложенията, без да се предизвикват прекъсвания или несъответствия.
- Сигурност: Излагането на приложения в интернет носи рискове и изисква внимателно управление на сертификати, потребителски достъп и потенциални уязвимости.
- Наблюдение и докладване: Получаването на ясна представа за представянето и здравето на приложенията в реално време може да бъде предизвикателство, особено в разпределени среди.
За щастие, съвременните инструменти и практики за контейнеризация и оркестрация, като Docker и Kubernetes, могат значително да опростят много от тези предизвикателства. Нека разгледаме как.
Преглед на нашата архитектура
За целите на тази статия, ще покажем как да разгърнем две Python приложения (уеб приложение и работна опашка) заедно с техните зависимости (база данни и кеш) на един Linux сървър, използвайки Docker Compose. Ще използваме Traefik като reverse proxy за маршрутизиране на заявките към правилните услуги и автоматично управление на Let’s Encrypt SSL сертификати.
Ето обобщение на архитектурата:
Стъпки за реализация
Сега нека преминем през стъпките за настройка на тази архитектура.
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 volumedb-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. Тази настройка осигурява няколко ключови предимства:
- Консистентност на средата: Всички зависимости и конфигурации са опаковани в Docker образи, гарантирайки, че приложението ще работи еднакво навсякъде.
- Лесно разполагане: С една команда
docker-compose up
можете да стартирате или актуализирате всички услуги. - Мащабируемост: Можете лесно да увеличавате броя на контейнерите за всяка услуга според натоварването, като използвате
docker-compose scale
. - Сигурност: Traefik автоматично управлява SSL сертификатите и пренасочва HTTP към HTTPS.
- Наблюдаемост: Docker Compose и Traefik предоставят вградени инструменти за наблюдение на здравето и представянето на приложенията.
Разбира се, това е само един възможен подход и настройките могат да се променят според вашите специфични нужди. За по-сложни сценарии и по-голям мащаб, вероятно ще искате да разгледате пълноценна платформа за оркестрация като Kubernetes.
В бъдещи статии ще разгледаме по-нататъшни теми като непрекъснато разгръщане с CI/CD pipelines, хоризонтално мащабиране с Kubernetes и наблюдение на производителността с инструменти като Prometheus и Grafana.