Linux

Docker Compose для Linux: создайте первый стек сервисов

Это руководство познакомит вас с Docker Compose — инструментом для оркестрации контейнеров. Вы создадите файл docker-compose.yml и запустите стек из веб-сервиса и PostgreSQL. Подходит для начинающих разработчиков и админов Linux.

Обновлено 17 февраля 2026 г.
15-20 мин
Низкая
FixPedia Team
Применимо к:Docker Engine 20.10+Docker Compose v2.0+Ubuntu 20.04/22.04CentOS 8/Rocky 9

Введение / Зачем это нужно

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

После выполнения этого гайда вы:

  • Поймёте базовый синтаксис docker-compose.yml
  • Научитесь запускать стек из веб-сервиса и базы данных
  • Узнаете, как управлять жизненным циклом контейнеров одной командой

Требования / Подготовка

Перед началом убедитесь, что у вас установлено:

  1. Docker Engine (версия 20.10 или новее)
  2. Docker Compose v2 (входит в состав Docker Desktop для Linux или как плагин docker-compose-plugin)
  3. Права sudo (или пользователь в группе docker)

Проверьте установку:

docker --version
docker compose version

Если Docker Compose не установлен, на Ubuntu/Debian:

sudo apt update
sudo apt install docker-compose-plugin

На CentOS/Rocky/AlmaLinux:

sudo yum install docker-compose-plugin

Шаг 1: Создайте структуру проекта

Создайте каталог для вашего приложения и перейдите в него:

mkdir myapp && cd myapp

В этом каталоге создайте файл docker-compose.yml. Мы будем разворачивать простой стек:

  • Сервис web: Python Flask-приложение
  • Сервис db: PostgreSQL

Шаг 2: Напишите файл docker-compose.yml

Создайте файл docker-compose.yml со следующим содержимым:

version: '3.8'

services:
  web:
    image: python:3.11-slim
    command: >
      sh -c "pip install flask psycopg2-binary &&
             echo 'from flask import Flask\nfrom psycopg2 import connect\napp = Flask(__name__)\n@app.route(\"/\")\ndef hello():\n    try:\n        conn = connect(dbname=\"testdb\", user=\"user\", password=\"password\", host=\"db\")\n        return \"Hello from Docker Compose! DB connection: OK\"\n    except Exception as e:\n        return f\"DB error: {e}\"\nif __name__ == \"__main__\":\n    app.run(host=\"0.0.0.0\", port=5000)' > app.py &&
             python app.py"
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      - DATABASE_URL=postgresql://user:password@db/testdb
    networks:
      - app-network

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: testdb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app-network
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

Пояснения к файлу:

  • version: указывает версию схемы Compose (используйте 3.8 для совместимости)
  • services: список контейнеров (сервисов)
    • web:
      • image: базовый образ Python
      • command: запускает скрипт, который устанавливает Flask, создаёт простое приложение и запускает его
      • ports: пробрасывает порт 5000 контейнера на порт 5000 хоста
      • depends_on: гарантирует, что db запустится до web
      • environment: переменные окружения (используются в приложении)
      • networks: присоединяет сервис к пользовательской сети app-network
    • db:
      • image: образ PostgreSQL 15
      • environment: учётные данные БД
      • volumes: том postgres_data сохраняет данные БД на хосте (даже после удаления контейнера)
      • healthcheck: проверка готовности PostgreSQL (важно для depends_on)
  • volumes: объявляет именованный том postgres_data
  • networks: создаёт сеть app-network (по умолчанию driver bridge)

Шаг 3: Запустите стек

В каталоге с docker-compose.yml выполните:

docker compose up -d

Что произойдёт:

  1. Docker Compose прочитает конфигурацию
  2. Создаст сеть myapp_app-network (префикс — имя каталога)
  3. Загрузит образы python:3.11-slim и postgres:15-alpine (если их нет локально)
  4. Запустит контейнеры в фоновом режиме (-d)

💡 Совет: Первый запуск может занять минуту — Docker скачивает образы (около 500 МБ).

Шаг 4: Проверьте работу

  1. Посмотрите статус контейнеров:
    docker compose ps
    

    Вывод должен показать оба сервиса в состоянии Up.
  2. Проверьте логи (если что-то не работает):
    docker compose logs web
    docker compose logs db
    
  3. Тестируйте приложение: Откройте браузер и перейдите по адресу http://localhost:5000. Должны увидеть:
    Hello from Docker Compose! DB connection: OK
    

    Это значит, что веб-контейнер успешно подключился к PostgreSQL.
  4. Проверьте сеть:
    docker network ls | grep app-network
    docker network inspect myapp_app-network
    

Шаг 5: Управление стеком

Основные команды:

КомандаДействие
docker compose downОстанавливает и удаляет контейнеры, сети (тома остаются)
docker compose down -vУдаляет также тома (данные БД будут потеряны!)
docker compose logs -fОтслеживает логи в реальном времени
docker compose exec web bashЗаходит в контейнер web
docker compose stopОстанавливает контейнеры (без удаления)
docker compose startЗапускает остановленные контейнеры
docker compose rmУдаляет остановленные контейнеры

Пример перезапуска только одного сервиса:

docker compose restart web

Шаг 6: Модификация и пересборка

Если вы изменили docker-compose.yml или нужно пересобрать образ (например, добавили Dockerfile), используйте:

docker compose up -d --build

Для принудительной перезагрузки контейнеров без сборки:

docker compose up -d --force-recreate

Проверка результата

Критерии успеха:

  • Контейнеры запущены (docker compose ps показывает Up)
  • Веб-приложение отвечает на http://localhost:5000 и сообщает об успешном подключении к БД
  • Данные PostgreSQL сохраняются в томе postgres_data (проверьте docker volume ls)

Если что-то не работает:

  1. Проверьте логи: docker compose logs
  2. Убедитесь, что порт 5000 не занят другим приложением
  3. Проверьте, что оба сервиса в одной сети: docker network inspect myapp_app-network

Возможные проблемы

Ошибка: Error response from daemon: port is already allocated

Причина: Порт 5000 уже используется другим процессом. Решение:

  • Остановите конфликтующий процесс (sudo lsof -i:5000 и kill)
  • Или измените проброс портов в docker-compose.yml (например, "8080:5000")

Ошибка: postgres: connection to server at "db" (172.20.0.2), port 5432 failed: Connection refused

Причина: Веб-контейнер пытается подключиться к БД до её полной готовности. Решение:

  • Убедитесь, что в db есть healthcheck (как в примере)
  • Добавьте в команду web ожидание (например, через wait-for-it.sh или dockerize)
  • Или увеличьте depends_on с условием condition: service_healthy

Ошибка: permission denied while trying to connect to the Docker daemon socket

Причина: Текущий пользователь не в группе docker. Решение:

sudo usermod -aG docker $USER
newgrp docker

Или используйте sudo для команд Docker.

Том postgres_data не создаётся

Причина: Ошибка в синтаксисе volumes или недостаточно прав. Решение:

  • Проверьте отступы в YAML (пробелы, не табы)
  • Убедитесь, что в db путь тома /var/lib/postgresql/data существует в образе PostgreSQL
  • Посмотрите docker volume ls — том должен называться [каталог]_postgres_data

Образы не скачиваются (ошибки сети)

Причина: Проблемы с доступом к Docker Hub. Решение:

  • Настройте DNS в Docker (/etc/docker/daemon.json)
  • Используйте зеркало (например, registry-mirrors для Kubernetes/OpenShift)
  • Или загрузите образы вручную: docker pull python:3.11-slim

Часто задаваемые вопросы

Что такое Docker Compose и зачем он нужен?
Как установить Docker Compose на Linux?
В чём разница между `docker-compose` и `docker compose`?
Как запустить docker-compose в фоновом режиме?

Полезное

Установите Docker Compose (если не установлен)
Создайте каталог проекта и файл docker-compose.yml
Настройте сервисы в docker-compose.yml
Запустите стек командой docker compose up
Проверьте статус контейнеров
Остановите и удалите контейнеры