Docker. Docker Compose. Часть 4

Docker Compose — это инструмент для определения и запуска мультиконтейнерных Docker-приложений. С помощью единого YAML-файла можно описать все необходимые сервисы и поднять их одной командой.
Что такое docker-compose.yml?
Файл docker-compose.yml содержит описание сервисов, сетей, томов и переменных окружения, необходимых для работы приложения.
Основные элементы:
version— версия формата файла (например, ‘3.9’)services— список контейнеров (например,web,db)buildилиimage— путь кDockerfileили имя образаports— проброс портовvolumes— монтирование томов или директорийenvironment— переменные окруженияdepends_on— порядок запуска сервисов
Пример:
1version: '3.9'
2
3services:
4 web:
5 build: ./web
6 ports:
7 - "80:80"
8 depends_on:
9 - app
10
11 app:
12 build: ./app
13 environment:
14 - APP_ENV=productionПример: развертывание веб-приложения (Nginx + Python)
Предположим, у нас есть приложение на Python (Flask), и мы хотим раздавать его через NGINX.
Структура проекта:
project/
├── docker-compose.yml
├── nginx/
│ └── default.conf
├── app/
│ ├── app.py
│ └── Dockerfileapp/app.py:
1from flask import Flask
2app = Flask(__name__)
3
4@app.route('/')
5def hello():
6 return "Привет от Flask через NGINX!"app/Dockerfile:
1FROM python:3.11-slim
2WORKDIR /app
3COPY . .
4RUN pip install flask
5CMD ["python", "app.py"]nginx/default.conf:
1server {
2 listen 80;
3
4 location / {
5 proxy_pass http://app:5000;
6 proxy_set_header Host $host;
7 proxy_set_header X-Real-IP $remote_addr;
8 }
9}docker-compose.yml:
1version: '3.9'
2
3services:
4 app:
5 build: ./app
6 expose:
7 - "5000"
8
9 web:
10 image: nginx:alpine
11 ports:
12 - "8080:80"
13 volumes:
14 - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
15 depends_on:
16 - appЗапуск приложения:
1docker compose up --buildПерейдите в браузере по адресу http://localhost:8080, и вы увидите ответ от Flask-приложения, которое работает за прокси-сервером NGINX.
Советы:
Полезные советы по работе с docker-compose, которые помогут упростить сопровождение, повысить читаемость и улучшить безопасность ваших конфигураций.
1. Используйте .env для хранения конфигураций
Файл .env позволяет выносить переменные окружения из docker-compose.yml. Это делает файл конфигурации чище, а конфиденциальные или переменные данные — более управляемыми.
Пример .env:
POSTGRES_USER=admin
POSTGRES_PASSWORD=securepass123
APP_PORT=8080Фрагмент docker-compose.yml:
1services:
2 db:
3 image: postgres
4 environment:
5 - POSTGRES_USER=${POSTGRES_USER}
6 - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
7 app:
8 build: .
9 ports:
10 - "${APP_PORT}:80"⚠️ Не забывайте добавлять
.envв.gitignore, если в нем содержатся секреты.
2. Разделяйте Dockerfile по сервисам
Если у вас несколько разных приложений (например, API на Python и фронт на React), создавайте отдельный Dockerfile для каждого сервиса. Это упрощает поддержку и предотвращает конфликт зависимостей.
Пример структуры проекта:
project-root/
├── backend/
│ ├── Dockerfile
│ └── ...
├── frontend/
│ ├── Dockerfile
│ └── ...
└── docker-compose.ymlФрагмент docker-compose.yml:
1services:
2 api:
3 build:
4 context: ./backend
5 frontend:
6 build:
7 context: ./frontend3. Следите за логами: docker compose logs -f
Для отслеживания состояния контейнеров и устранения проблем используйте команду:
1docker compose logs -fФлаг -f (или --follow) позволяет в реальном времени просматривать вывод логов всех сервисов или определенного:
1docker compose logs -f app📌 Используйте фильтрацию
grep, если нужно найти ошибки:1docker compose logs -f | grep ERROR
4. Останавливайте и очищайте: docker compose down
Команда down полностью завершает работу сервисов и удаляет все связанные ресурсы (сети, контейнеры, тома и т.д.).
1docker compose downЕсли вы хотите также удалить связанные тома:
1docker compose down -v✅ Это особенно полезно во время разработки, чтобы перезапустить всё “с чистого листа”.
Cледующая часть
Docker: Лучшие практики и распространённые ошибки. Часть 5