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
│ └── Dockerfile
app/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: ./frontend
3. Следите за логами: 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