🏠 Домашнее задание 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 для хранения файлов БД.
- Напишите
docker-compose.ymlфайл для запуска нескольких сервисов: Nginx, Redis и MySQL. - Настройте volume
mysql_dataдля хранения данных базы данных MySQL. - Определите сервисы:
- web:
- image: Используемый образ, в данном случае
nginx:latest, это официальный образ Nginx. - ports: Проброс порта 8080 на порт 80 контейнера.
- image: Используемый образ, в данном случае
- redis:
- image:
redis:latest, это официальный образ Redis.
- image:
- mysql:
- image: Используемый образ
mysql:8.0 - environment: Переменные окружения для настройки базы данных MySQL.
- volumes:
mysql_dataдля хранения данных базы данных MySQL.
- image: Используемый образ
- web:
- Выполните определение сети:
- 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
Открытие проекта
- Откройте папку
homework04в VS Code: File → Open Folder - Откройте встроенный терминал: Ctrl+` (или View → Terminal)
- В терминале выполните шаги из решения выше
Расширение Docker для VS Code
Если установлено расширение Docker (Microsoft):
- Левая панель → иконка Docker (кит)
- Раздел Containers — видите все запущенные контейнеры
- Правый клик на контейнере → View Logs — логи в редакторе
- Правый клик → Open in Browser — быстрый доступ к web-сервису
Автодополнение YAML в VS Code
Расширение YAML (Red Hat) даёт подсветку и автодополнение для docker-compose.yml. Установите через Extensions → поиск «YAML».
Связь с теорией и примерами
- Теория: Docker Compose — структура compose-файла, ключи services/volumes/networks
- Теория: Типы сетей — bridge-сеть и почему контейнеры видят друг друга по имени
- Примеры: nginx + PostgreSQL — аналогичная схема web + db
- Справочник: docker compose команды — up, down, ps, logs, exec
- Ошибки: секреты в compose-файле — как правильно хранить пароли через .env
Для продвинутого решения: попробуйте добавить healthcheck для MySQL и
depends_on: condition: service_healthy для web-сервиса — как показано в примере 4 и разделе теории по depends_on.