JavaRush /Курсы /Модуль 2: Fullstack /Введение в Docker Compose

Введение в Docker Compose

Модуль 2: Fullstack
14 уровень , 0 лекция
Открыта

1.1 Основные концепции Docker Compose

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

Основные концепции Docker Compose

  1. определение сервисов: Docker Compose позволяет определить все компоненты приложения (например, веб-серверы, базы данных, кэш и другие сервисы) в одном конфигурационном файле.
  2. многоконтейнерные приложения: Compose упрощает запуск и координацию приложений, состоящих из нескольких контейнеров.
  3. автоматизация процессов: с Compose можно автоматизировать развертывание, управление и масштабирование всех контейнеров, входящих в состав приложения.

Зачем нужен Docker Compose?

  1. упрощение управления сложными приложениями: в современных приложениях часто используются несколько сервисов, работающих в отдельных контейнерах. Docker Compose упрощает управление этими сервисами.
  2. консистентность окружения: Docker Compose обеспечивает одинаковую конфигурацию окружения для разработки, тестирования и производства, что уменьшает вероятность возникновения ошибок, связанных с различиями в конфигурациях.
  3. ускорение разработки: с Compose можно легко запускать и останавливать все необходимые сервисы с помощью одной команды, что ускоряет процесс разработки и тестирования.
  4. масштабируемость: Docker Compose позволяет легко масштабировать сервисы, увеличивая количество экземпляров контейнеров по мере необходимости.

Важно! Раньше Docker Compose был отдельным приложением, и все его команды начинались со слов «docker-compose …». Однако в Docker версии 20 и выше Compose интегрирован, и команды теперь начинаются со слов «docker compose …».

Поэтому иногда в интернете вы можете встретить примеры со старой записью «docker-compose», а иногда – с новой «docker compose». Не пугайтесь, обе версии работают одинаково.

Также обратите внимание, что файл конфигурации теперь может называться как docker-compose.yaml, так и compose.yaml. Обе версии поддерживаются и функционируют одинаково, но compose.yaml используется в более новых версиях Docker Compose.

1.3 Основные команды Docker Compose

1. Запуск приложения

Эта команда читает файл compose.yaml (или docker-compose.yml), создает и запускает все определенные в нем сервисы.

Terminal


docker compose up

2. Остановка приложения

Эта команда останавливает и удаляет все контейнеры, сети и тома, созданные с помощью docker compose up.

Terminal


docker compose down

3. Просмотр логов

Эта команда выводит логи всех сервисов, что позволяет легко отлаживать приложение.

Terminal


docker compose logs

4. Перезапуск сервисов

Эта команда перезапускает все или указанные сервисы, что полезно при внесении изменений в код или конфигурацию.

Terminal


docker compose restart

1.4 Применение Docker Compose

Преимущества использования Docker Compose

  1. легкость развертывания: с Docker Compose можно развернуть сложное приложение одной командой.
  2. поддержка зависимостей: Compose автоматически управляет зависимостями между сервисами, гарантируя их правильный порядок запуска.
  3. изоляция сервисов: каждый сервис работает в своем собственном контейнере, что обеспечивает изоляцию и уменьшает риск конфликта между сервисами.
  4. гибкость: Docker Compose поддерживает различные конфигурации для разработки, тестирования и производства, что упрощает управление окружениями.

Применение Docker Compose

Docker Compose широко используется для:

  1. разработки: упрощает создание консистентного окружения разработки, которое можно легко разделить между командой разработчиков.
  2. тестирования: обеспечивает возможность быстрого создания тестового окружения, идентичного производственному.
  3. производства: упрощает развертывание и управление многоконтейнерными приложениями в производственных средах.
3
Задача
Модуль 2: Fullstack, 14 уровень, 0 лекция
Недоступна
Запуск всех контейнеров приложения
Запуск всех контейнеров приложения
3
Задача
Модуль 2: Fullstack, 14 уровень, 0 лекция
Недоступна
Остановка и удаление всех контейнеров приложения
Остановка и удаление всех контейнеров приложения
3
Задача
Модуль 2: Fullstack, 14 уровень, 0 лекция
Недоступна
Просмотр логов запущенного приложения
Просмотр логов запущенного приложения
3
Задача
Модуль 2: Fullstack, 14 уровень, 0 лекция
Недоступна
Перезапуск сервиса базы данных
Перезапуск сервиса базы данных
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Андрей Уровень 44
15 ноября 2025
#!/bin/bash set -euo pipefail COMPOSE_FILE="ru/rush/python/fullstack/level04/task04/docker-compose.yml" WEB_URL="http://localhost/" MAX_DOWNTIME_SEC=10 INTERVAL=0.2 # секунды между проверками (поддерживается в GNU sleep) log() { echo "[$(date -Iseconds)] $*" } # ==== 1. Запуск приложения ==== log "Запуск приложения..." docker-compose -f "$COMPOSE_FILE" up -d # ==== 2. Проверка начальной доступности ==== log "Проверка начальной доступности веб-сервиса..." if ! curl -sf -o /dev/null -w "%{http_code}" "$WEB_URL" | grep -q "200"; then log "Ошибка: веб-сервис не отвечает 200 на старте" exit 1 fi # ==== 3. Функция для проверки веб-сервиса ==== check_web() { local code code=$(curl -s --connect-timeout 2 --max-time 3 -o /dev/null -w "%{http_code}" "$WEB_URL" 2>/dev/null || echo "000") echo "$code" } # ==== 4. Быстрая проверка перед перезапуском (baseline) ==== log "Baseline: веб-сервис отвечает 200" check_web | grep -q "200" || { log "Baseline failed"; exit 1; }
Андрей Уровень 44
15 ноября 2025
# ==== 5. Запуск фонового мониторинга доступности ==== log "Запуск мониторинга доступности во время перезапуска..." downtime_start="" downtime_end="" last_seen_up=$(date +%s.%N) # Временный файл для записи результатов мониторинга monitor_log=$(mktemp) trap "rm -f $monitor_log" EXIT # Фоновый процесс: опрашивать каждые $INTERVAL сек { while true; do ts=$(date +%s.%N) code=$(check_web) echo "$ts $code" >> "$monitor_log" if [[ "$code" == "200" ]]; then last_seen_up="$ts" if [ -z "$downtime_end" ] && [ -n "$downtime_start" ]; then downtime_end="$ts" log "Веб-сервис восстановлен в $(date -d "@${downtime_end%.*}" -Iseconds)" fi else if [ -z "$downtime_start" ]; then downtime_start="$ts" log "Простой начался в $(date -d "@${downtime_start%.*}" -Iseconds) (получен код $code)" fi fi sleep "$INTERVAL" done } & MONITOR_PID=$! # Дать монитору запуститься sleep 0.1 # ==== 6. Перезапуск MySQL с логированием ==== log "Перезапуск сервиса 'db'..." restart_output=$(docker-compose -f "$COMPOSE_FILE" restart db 2>&1) restart_exit=$? echo "$restart_output" | while IFS= read -r line; do log "[docker-compose restart] $line"; done if [ $restart_exit -ne 0 ]; then log "Ошибка при перезапуске db" kill $MONITOR_PID 2>/dev/null exit 1 fi # ==== 7. Ожидание, пока db-контейнер запустится ==== log "Ожидание, пока контейнер db перейдёт в состояние 'running'..." timeout 30s bash -c ' while ! docker-compose -f "'"$COMPOSE_FILE"'" ps db | grep -q "Up"; do sleep 0.5 done '
Андрей Уровень 44
15 ноября 2025
# ==== 8. (Опционально) Проверка, что MySQL действительно готов ==== # Например, через выполнение простого SQL-запроса внутри контейнера log "Проверка готовности MySQL..." timeout 30s bash -c ' while ! docker-compose -f "'"$COMPOSE_FILE"'" exec -T db mysqladmin ping -h localhost --silent; do sleep 0.5 done ' log "MySQL готов к подключениям." # ==== 9. Остановка мониторинга через фиксированное время или после стабильного восстановления ==== sleep 2 # дать немного поработать после MySQL ready # Остановить мониторинг kill $MONITOR_PID 2>/dev/null wait $MONITOR_PID 2>/dev/null || true # ==== 10. Анализ лога мониторинга ==== log "Анализ доступности..." downtime_duration=0 if [ -n "$downtime_start" ]; then if [ -z "$downtime_end" ]; then # если не восстановился — считаем концом текущий момент downtime_end=$(date +%s.%N) fi # Вычисляем разницу в секундах (bash не поддерживает float, используем bc) downtime_duration=$(echo "$downtime_end - $downtime_start" | bc -l) downtime_duration=${downtime_duration%%.*} # округляем вниз до секунд для лога log "Общий простой: ${downtime_duration} секунд" else log "Простой не зафиксирован: веб-сервис всегда отвечал 200" fi # ==== 11. Финальная проверка ==== final_code=$(check_web) if [[ "$final_code" != "200" ]]; then log "❌ Финальная проверка провалена: HTTP $final_code" exit 1 else log "✅ Тест пройден: веб-сервис доступен" fi # ==== 12. Доп. проверка: нет ли ошибок в логах nginx или бэкенда (опционально) ==== # Например: docker-compose -f "$COMPOSE_FILE" logs web | grep -i error exit 0
Ахмад Уровень 45
26 октября 2025
Я так понимаю, для прохождения этого курса нужно обладать экстрасенсорными способностями, заглядывать в будущее и знать заранее ключи к командам, которые в этой лекции мы ещё не проходили?
Андрей Уровень 44
13 ноября 2025
Собственно, как обычно..