Лабораторна робота №6. Docker compose

https://github.com/lisnayk/conteinirization-2023/blob/master/labs/lab6.md

Мета: Ознайомитися з основними можливостями docker compose.

Теоритичні відомості

Pеальні додатки мають окремий контейнер для кожної своєї служби. Це означає, що доведеться створити велику кількість Docker-файлів і потім окремо керувати кожним контейнером, що є громіздким процесом. docker-compose — інструмент, що допомагає визначати та запускати багатоконтейнерні додатки. Docker Compose дозволяє запускати та зупиняти всі служби простими командами за допомогою одного YAML-файлу для кожної конфігурації.

Основна структура файлу docker-compose.yml виглядає наступним чином:

version: '3.8'  # Визначає версію Docker Compose (рекомендується використовувати актуальну)
services:       # Визначає сервіси, тобто контейнери, що будуть запущені
  app:          # Ім'я сервісу (контейнера)
    image: node:14  # Базовий образ Docker для сервісу (наприклад, Node.js)
    volumes:    # Зв'язування томів для зберігання даних
      - .:/app  # Локальна директорія зв'язується з директорією в контейнері
    ports:      # Відкриті порти для доступу до сервісу
      - "3000:3000"
    environment:  # Змінні середовища для контейнера
      - NODE_ENV=development
    depends_on:   # Вказує на залежність від іншого сервісу
      - db

  db:           # Ім'я другого сервісу (наприклад, база даних)
    image: postgres:13  # Використовуваний образ PostgreSQL
    volumes:
      - pgdata:/var/lib/postgresql/data  # Том для зберігання даних бази
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=mydatabase

volumes:        # Описує томи для постійного зберігання даних
  pgdata:

Основні команди для керування Docker Compose:

Команда Опис
docker-compose up Запускає всі сервіси, визначені у файлі docker-compose.yml.
docker-compose up -d Запускає сервіси у фоновому режимі (detached mode).
docker-compose down Зупиняє всі сервіси та видаляє контейнери, мережі та томи, створені docker-compose.
docker-compose build Створює або оновлює образи для сервісів на основі Dockerfile, визначених у docker-compose.
docker-compose stop Зупиняє всі або зазначені сервіси, не видаляючи їх.
docker-compose start Запускає всі або зазначені сервіси, які були зупинені.
docker-compose restart Перезапускає всі або зазначені сервіси.
docker-compose ps Показує статус запущених контейнерів у проєкті docker-compose.
docker-compose logs Відображає журнали всіх або зазначених сервісів.
docker-compose exec <service> <command> Виконує команду в запущеному контейнері зазначеного сервісу.
docker-compose pull Завантажує останні версії образів, визначених у docker-compose.yml.
docker-compose rm Видаляє зупинені контейнери, які були створені docker-compose.
docker-compose config Перевіряє файл docker-compose.yml на помилки синтаксису та відображає фінальну конфігурацію.
docker-compose kill Примусово зупиняє всі або зазначені сервіси.

Можливостей Docker Compose:

  • Усі служби ізольовані та працюють на одному хості.
  • Контейнери перезапускаються лише при зміні.
  • Дані в об'ємах зберігаються при створенні нових контейнерів.
  • Переміщення змінних та композиції між середовищами.
  • Створюється віртуальна мережа для зручної взаємодії в межах середовищ.

Переваги Docker Compose

  • Просте керування багатоконтейнерними додатками: Спрощує процес керування кількома контейнерами.
  • Послідовність середовищ: Забезпечує узгодженість середовищ розробки, тестування та продакшну.
  • Автоматизація: Легко налаштовує та зупиняє багатоконтейнерні середовища.
  • Ефективне керування ресурсами: Підвищує продуктивність додатка та масштабованість.

Недоліки Docker Compose

  • Обмежена масштабованість: Не підходить для великих і складних розгортань.
  • Підтримка тільки одного хоста: Працює лише на одному хості.
  • Базове балансування навантаження: Відсутні розширені функції балансування навантаження.
  • Мінімальні можливості моніторингу: Немає вбудованих можливостей для моніторингу.

Завдання

  1. Ознайомитися з теоритичним матеріалом.
  2. Завантажити та проагналізувати додатоки у директорій templates/lab6
  3. Створити docker-compose.yml файл для запуску сервісів наведених у таблиці 1 та зображены на рис 1.

Таблиця 1

Service Name Image Ports Environment Variables Description
certboot itzg/openssl-ubuntu - CERT_GEN_COMMAND сервіс, який генерує сертифікати вебсервера й зберігає їх у папці certs виконуючи команду CERT_GEN_COMMAND з .env файлу
frontend-build node:20 - VITE_ARTICLES_URL, VITE_USERS_URL сервіс, який виконую билд VueJS додатку допомогою команди npm run build:all та очикую пареметри середовища VITE_ARTICLES_URL та VITE_USERS_URL значення яких знаходиться в .env файлі.
web nginx:latest 80, 443 - сервіс, який відкриває порт 80 та 443, обслуговую запити до VueJs додатку, виступаэ revers-proxy сервером для запитиів на /api/users та /api/articles, отримуэ конфігурації з файлу ./nginx/nginx.conf.
python-app custom dockerfile based on python:3.8 5000 - сервіс, який запускає Flask додаток, відповідає на запити /api/articles
php-app webdevops/php-apache:7.4 8080 WEB_DOCUMENT_ROOT=/app, DB_HOST, DB_NAME, DB_USER, DB_PASS сервіс, який запускає PHP додаток, відповідає на запити /api/users, приймаэ параметри середовища для підключення до сервісу баз даних.
mysql mysql:latest 3306 MYSQL_ROOT_PASSWORD сервіс, який запускає MySQL базу даних використовуючи скрипт ініціалізації бази даних.
  1. Оновити інформацію про себе у сервісі frontend.
  2. Запустити сервіси за допомогою команди docker-compose up -d.
  3. Перевірити роботу сервісів в браузері. У разі успішної конфігурації результат буде аналогічним рис. 2.
  4. Зупинити сервіси за допомогою команди docker-compose down.
  5. Всі команди та результати виконання відобразити у звті.

lab_6.png

Рисунок 1. Архітектура додатку

img6_1.png

Рисунок 2. Результат роботи додатку

Контрольні питання

  1. Що таке docker-compose і для чого він використовується?
  2. Яка структура файлу docker-compose.yml і які основні секції він містить?
  3. Як запустити всі сервіси, визначені у файлі docker-compose.yml, у фоновому режимі?
  4. Чим відрізняються команди docker-compose up та docker-compose start?
  5. Як зупинити всі сервіси та видалити контейнери, мережі та томи, створені docker-compose?
  6. Як створити та оновити образи для всіх сервісів, використовуючи docker-compose?
  7. Як переглянути статус і список усіх запущених контейнерів у проєкті docker-compose?
  8. Для чого використовується секція networks у файлі docker-compose.yml?
  9. Як за допомогою docker-compose виконати команду всередині запущеного контейнера сервісу?
  10. Як змусити docker-compose перевірити файл конфігурації на синтаксичні помилки?
  11. Як видалити всі зупинені контейнери, створені за допомогою docker-compose?