Перейти к содержимому

Docker Compose: приложение из нескольких контейнеров

Описать сервисы в compose.yaml, хранить секреты в .env, сохранять данные в томах и обновлять образы.

Уровень
Средний
Время чтения
3 мин чтения
Обновлено
Проверено на
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Содержание
  1. Структура проекта
  2. Запуск и управление
  3. Перезапуск после сбоев и перезагрузки
  4. Обновление образов
  5. Проверьте результат
  6. Частые ошибки

Compose описывает всё приложение одним файлом: какие контейнеры запустить, как они связаны, где хранят данные и что делать при падении. Файл лежит рядом с проектом, его удобно держать в git.

Структура проекта

bash
$ mkdir -p /opt/myapp && cd /opt/myapp$ touch compose.yaml .env

Пример: веб-приложение и PostgreSQL. Приложение стартует, когда база станет здоровой, данные базы лежат в именованном томе.

/opt/myapp/compose.yaml
services:  db:    image: postgres:16    restart: unless-stopped    environment:      POSTGRES_DB: app      POSTGRES_USER: app      POSTGRES_PASSWORD: ${DB_PASSWORD}    volumes:      - db-data:/var/lib/postgresql/data    healthcheck:      test: ["CMD-SHELL", "pg_isready -U app -d app"]      interval: 10s      timeout: 5s      retries: 5  web:    image: ghcr.io/example/myapp:1.4.2    restart: unless-stopped    env_file: .env    environment:      DATABASE_URL: postgres://app:${DB_PASSWORD}@db:5432/app    ports:      - "127.0.0.1:3000:3000"    depends_on:      db:        condition: service_healthyvolumes:  db-data:
/opt/myapp/.env
DB_PASSWORD=замените-на-длинный-случайный-пароль
Сгенерировать пароль и закрыть .env от других пользователей
$ openssl rand -hex 24$ chmod 600 .env

Запуск и управление

bash
$ docker compose up -d$ docker compose ps$ docker compose logs -f web$ docker compose exec db psql -U app app$ docker compose down

Сервисы видят друг друга по имени: приложение подключается к базе по адресу db:5432. Публиковать порт базы наружу для этого не нужно.

Перезапуск после сбоев и перезагрузки

restart: unless-stopped поднимает контейнер после падения и после перезагрузки сервера, если вы не остановили его вручную. Служба docker включается в автозапуск при установке — проверьте: systemctl is-enabled docker.

Обновление образов

bash
$ cd /opt/myapp$ docker compose pull$ docker compose up -d$ docker image prune -f

up -d пересоздаст только те контейнеры, у которых изменился образ или настройки. Тома при этом сохраняются.

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

bash
$ docker compose ps$ curl -I http://127.0.0.1:3000

У базы в колонке STATUS должно быть (healthy), приложение должно отвечать на локальном порту.

Частые ошибки

  • docker compose down -v удаляет тома вместе с данными базы. Без -v тома остаются.
  • Смена POSTGRES_PASSWORD в .env не меняет пароль существующей базы: переменная читается только при первой инициализации тома.
  • Команда docker-compose (через дефис) — устаревшая отдельная программа. Используйте docker compose из плагина.

Дочитайте до конца — статья засчитается в обучении автоматически.

  • compose
  • docker
  • контейнеры
  • тома
  • healthcheck

Статья помогла?