UNIXAWESOME

Docker. Docker Compose. Часть 4

#docker #container

Docker Compose — это инструмент для определения и запуска мультиконтейнерных Docker-приложений. С помощью единого YAML-файла можно описать все необходимые сервисы и поднять их одной командой.

Что такое docker-compose.yml?

Файл docker-compose.yml содержит описание сервисов, сетей, томов и переменных окружения, необходимых для работы приложения.

Основные элементы:

Пример:

 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

Reply to this post by email ↪