🏠 Домашнее задание 4

📋 Docker & Cloud Tech: Домашнее задание 4

⚡ Суть задания

Создать файл docker-compose.yml для трёх сервисов: Nginx (веб-сервер), Redis (кеш), MySQL 8.0 (БД). Все в одной сети mynetwork. Данные MySQL хранятся в именованном томе mysql_data.

# docker-compose.yml (итоговый файл)

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - mynetwork

  redis:
    image: redis:latest
    networks:
      - mynetwork

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - mynetwork

volumes:
  mysql_data:

networks:
  mynetwork:

Задание из LMS (полный текст)

Создайте многоконтейнерное приложение с помощью Docker Compose, которое состоит из веб-сервера Nginx, базы данных Redis и базы данных MySQL с volume для хранения файлов БД.

  1. Напишите docker-compose.yml файл для запуска нескольких сервисов: Nginx, Redis и MySQL.
  2. Настройте volume mysql_data для хранения данных базы данных MySQL.
  3. Определите сервисы:
    • web:
      • image: Используемый образ, в данном случае nginx:latest, это официальный образ Nginx.
      • ports: Проброс порта 8080 на порт 80 контейнера.
    • redis:
      • image: redis:latest, это официальный образ Redis.
    • mysql:
      • image: Используемый образ mysql:8.0
      • environment: Переменные окружения для настройки базы данных MySQL.
      • volumes: mysql_data для хранения данных базы данных MySQL.
  4. Выполните определение сети:
    • mynetwork: Сеть, которая соединяет все контейнеры.

Подготовка окружения

Что потребуется

  • Docker Desktop установлен и запущен (Windows/Mac) или Docker Engine (Linux)
  • VS Code с расширением Docker (опционально, для удобства)
  • PowerShell или встроенный терминал VS Code

Проверка Docker

# терминал (PowerShell)

docker --version
# Docker version 27.x.x или выше

docker compose version
# Docker Compose version v2.x.x или выше

Создание рабочей директории

# терминал (PowerShell)

# Создать директорию для домашнего задания
New-Item -ItemType Directory -Name "homework04"
Set-Location homework04

Пошаговое решение

Шаг 1: Создать docker-compose.yml

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

# docker-compose.yml
# ДЗ 4: Nginx + Redis + MySQL в Docker Compose

services:
  # Веб-сервер Nginx
  web:
    image: nginx:latest
    ports:
      - "8080:80"    # порт 8080 хоста -> порт 80 в контейнере
    networks:
      - mynetwork

  # Redis — кеш / брокер сообщений
  redis:
    image: redis:latest
    networks:
      - mynetwork

  # MySQL 8.0 — реляционная база данных
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword    # пароль root (обязательно!)
      MYSQL_DATABASE: mydb                 # создать БД при старте
      MYSQL_USER: myuser                   # создать пользователя
      MYSQL_PASSWORD: mypassword           # пароль пользователя
    volumes:
      - mysql_data:/var/lib/mysql          # данные БД сохраняются в томе
    networks:
      - mynetwork

# Именованный том для данных MySQL
volumes:
  mysql_data:

# Пользовательская сеть для связи всех сервисов
networks:
  mynetwork:

Шаг 2: Запустить все сервисы

# терминал (PowerShell)
# Находимся в директории homework04

docker compose up -d

Ожидаемый вывод:

[+] Running 4/4
 ✔ Network homework04_mynetwork  Created
 ✔ Container homework04-redis-1  Started
 ✔ Container homework04-web-1    Started
 ✔ Container homework04-mysql-1  Started

Шаг 3: Проверить статус сервисов

# терминал

docker compose ps

Ожидаемый вывод: все три сервиса в состоянии running.

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

# терминал

# Вариант 1: открыть в браузере
# http://localhost:8080  — должна открыться страница Nginx "Welcome to nginx!"

# Вариант 2: через curl (если установлен)
curl http://localhost:8080

Шаг 5: Проверить логи

# терминал

docker compose logs web       # логи Nginx
docker compose logs redis     # логи Redis
docker compose logs mysql     # логи MySQL

Шаг 6: Подключиться к MySQL внутри контейнера

# терминал

# Войти в контейнер mysql
docker compose exec mysql bash

# Внутри контейнера: подключиться к MySQL
mysql -u myuser -pmypassword mydb

# Проверить: список баз данных
SHOW DATABASES;

# Выйти
exit
exit

Шаг 7: Проверить сохранность данных

# терминал

# Остановить всё (без -v — тома сохраняются!)
docker compose down

# Снова запустить
docker compose up -d

# Данные MySQL в томе mysql_data сохранились
docker compose exec mysql mysql -u myuser -pmypassword mydb -e "SHOW DATABASES;"

Шаг 8: Остановить и убрать контейнеры

# терминал

docker compose down
# Тома mysql_data сохранятся (нет флага -v)

# Полная очистка (ОСТОРОЖНО: удаляет данные):
# docker compose down -v

Проверка в VS Code

Открытие проекта

  1. Откройте папку homework04 в VS Code: File → Open Folder
  2. Откройте встроенный терминал: Ctrl+` (или View → Terminal)
  3. В терминале выполните шаги из решения выше

Расширение Docker для VS Code

Если установлено расширение Docker (Microsoft):

  • Левая панель → иконка Docker (кит)
  • Раздел Containers — видите все запущенные контейнеры
  • Правый клик на контейнере → View Logs — логи в редакторе
  • Правый клик → Open in Browser — быстрый доступ к web-сервису

Автодополнение YAML в VS Code

Расширение YAML (Red Hat) даёт подсветку и автодополнение для docker-compose.yml. Установите через Extensions → поиск «YAML».

Связь с теорией и примерами

Для продвинутого решения: попробуйте добавить healthcheck для MySQL и depends_on: condition: service_healthy для web-сервиса — как показано в примере 4 и разделе теории по depends_on.