Задача:

2. Развертывание приложений в Docker

  • Создайте ВМ Docker o OC Альт Сервер 10.2 o CPU 2 o OZU 4 гб o Storage 60 гб
  • Установите Docker и Docker Compose.
  • Создайте локальный Docker Registry.
  • В домашней директории хоста создайте файл name.txt и запишите в него строку experts.
  • Напишите Dockerfile для приложения Hello.
    • В качестве базового образа используйте alpine
    • Сделайте рабочей директорию /hello и скопируйте в неё name.txt
    • Контейнер при запуске должен выполнять команду echo, которая выводит сообщение "Hello! Greetings from" и затем содержимое файла name.txt, после чего завершать свою работу.
  • Соберите образ приложения App и загрузите его в ваш Registry.
    • Используйте номер версии 1.0 для вашего приложения
    • Образ должен быть доступен для скачивания и дальнейшего запуска на локальной машине.
  • Настройте мониторинг с помощью NodeExporter, Prometheus и Grafana в Docker.
    • Создайте в домашней директории пользователя файл monitoring.yml для Docker Compose:
    • Используйте контейнеры NodeExporter, Prometheus и Grafana для сбора, обработки и отображения метрик.
    • Настройте Dashboard для центра обработки данных DC в Grafana, в котором будет отображаться загрузка CPU, объём свободной оперативной памяти и места на диске. Для всех серверов.
    • Интерфейс Grafana должен быть доступен по внешнему адресу на порту 3000.

Вариант реализации:

HQ-CLI или BR-CLI:

  • Переходим в веб-интерфейс PVE на DC-SRV1 и скачиваем Альт Сервер 10.2, для дальнейшего создания ВМ Docker:

  • Создаём ВМ Docker o OC Альт Сервер 10.2 o CPU 2 o OZU 4 гб o Storage 60 гб:
    • Нажимаем Create VM - в поле Name задаём имя, нажимаем Next

    • Выбираем ISO - образ и нажимаем Next

    • нажимаем Next

    • Задаём размер виртуального диска согласно требованиям задания 60 ГБ и нажимаем Next

    • Задаём CPU согласно требованиям задания 2 и нажимаем Next

    • Задаём ОЗУ согласно требованиям задания 4 ГБ и нажимаем Next

    • На этапе настройки сети оставлям по умолчанию vmbr0 и нажимаем Next

    • Проверяем заданную конфигурацию ВМ и нажимаем Finish:

    • результат:
      • Нажимаем Start Now и переходим к установки ОС на ВМ:

    • Нажимаем Enter - чтобы начать этап установки Альт Сервер 10.2

    • Результат:

  • После чего можно подключиться в данной ВМ с терминала на клиенте для более удобной настройки

Docker:

  • Устанавливаем Docker и Docker Compose:
apt-get update && apt-get install -y docker-{ce,compose}
  • Включаем и добавляем в автозагрузку службу docker:
systemctl enable --now docker.service
  • Создаём и запускаем локальный Docker Registry:
    • поднимает контейнер Docker с именем DockerRegistry из образа registry:2. Контейнер будет слушать сетевые запросы на порту 5000, а параметр --restart=always позволит автоматически запускаться контейнеру после перезагрузки сервера.
docker run -d -p 5000:5000 --restart=always --name DockerRegistry registry:2
  • Проверяем:

  • Создаём в домашней директории файл name.txt и записываем в него строку experts:
echo  "experts" > ~/name.txt
  • Создаём Dockerfile для приложения Hello:
vim Dockerfile
    • содержимое:

где:

FROM - задаёт базовый образ;

WORKDIR - задаёт рабочию директорию внутри контейнера;

COPY - копирует файл с локального хоста в рабочию директорию контейнера;

CMD - определяем команду, которую необходимо будет выполнить после запуска контейнера, после чего контейнер будет остановлен

  • Выполняем сборку образа:
    • -t - позволяет присвоить имя собираемому образу;
    • "." - говорит о том что Dockerfile находится в текущей директории откуда выполняется данная команда и имеет имя именно Dockerfile:
docker build -t hello .
    • результат:

  • Проверяем:
    • наличие собранного образа:

    • запуск контейнера, что он выводит необходимое содержимое:

  • загружаем образ собранный из Dockerfile в локальной DockerRegistry:
    • присваиваем тег для размещения образа в локальном Docker Registry:
docker tag hello localhost:5000/hello:1.0
    • Загружаем образ в локальный Docker Registry:
docker push localhost:5000/hello:1.0
      • Результат:

  • Проверяем:
    • наличие образа:

    • и возможность загрузки из локального Docker Registry:
      • перед - удаляем образы localhost:5000/hello:1.0 и hello:

      • загружаем образ приложения Hello из локального Docker Registry:

      • Также проверяем возможность запуска приложения из скаченного образа из локального репозитория:

Docker:

Настроиваем мониторинг с помощью NodeExporter, Prometheus и Grafana

  • В домашней директории пользователя создаём файл monitoring.yml:
vim ~/monitoring.yml
    • содержимое:
version: "3.9"
services:
  grafana:
    container_name: Grafana
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - grafana-configs:/etc/grafana

  prometheus:
    container_name: Prometheus
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - prom-data:/prometheus
      - prom-configs:/etc/prometheus

  node-exporter:
    container_name: NodeExporter
    image: prom/node-exporter
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude'
      - '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
volumes:
  grafana-data:
  grafana-configs:
  prom-data:
  prom-configs:

Данный файл представляет описание трёх контейнеров:  grafana, prometheus и node-exporter:

    • grafana - это то, что мы будем видеть в браузере, это визуализатор метрик;
    • prometheus - это  своего рода база данных  в которой хранятся метрики;
    • node-exporter - это контейнер, который будет собирать метрики и отдавать на порту 9100

Схема работы получается следующая: prometheus забирает метрики с node-exporter, а grafana забирает метрики с prometheus

  • Выполняем сборку и запуск стека контейнеров описанных в файле monitoring.yml:
docker-compose -f monitoring.yml up -d
  • Проверяем:

  • Переходим в браузер http://<внешний IP адрес ВМ Docker>:3000
    • для доступа в веб-интерфейс Grafana - стандартный логин и пароль "admin":

    • Задаём новый пароль и подтверждаем его:

    • Результат:

  • Добавляем в Grafana - Prometheus:
    • на главном меню нажимаем Add your first data source

    • выбираем Prometheus:

    • вводим адрес контейнера с Prometheus:

    • Затем внизу на этой же странице нажимаем Save and Test:

      • результат теста:

  • Далее необходимо экспортировать grafana dashboard:

    • Результат:

  • Открываем скаченный файл и копируем его содержимое, затем переходим в наш веб-интерфейс grafana:
    • нажимаем Create your first dashboard:

    • Нажимаем Import dashboard:

    • Вставляем скопированное содержимое из скаченного файла и нажимаем Load:

    • Затем выбираем наш Prometheus и нажимаем Import:

      • Результат:

На данном этапе пока ещё результатов нет, так как необходимо добавить node-exporter в prometheus.yml расположенный в volumes docker

  • Открываем на редактирование файл по пути /var/lib/docker/volumes/root_prom-configs/_data/prometheus.yml:
vim /var/lib/docker/volumes/root_prom-configs/_data/prometheus.yml
    • добавляем в конец информацию о нашем контейнере с node-exporter:

  • Далее переходим в веб-интерфейс prometheus по http://<внешний IP адрес ВМ Docker>:9090
    • перейти в раздел Status -> Targets

    • Должен появиться новый Targets который мы добавили в файле prometheus.yml

  • Чтобы он появился необходимо перезапустить контейнеры:
docker-compose -f monitoring.yml restart
    • результат:

  • Возвращаемся в веб-интерфейс prometheus:

  • Переходим в веб-интерфейс Grafana:
    • наблюдаем необходимую по заданию информация - CPU, объём свободной оперативной памяти и места на диске: 
      • но пока только для ВМ Docker:

DC-SRV1 | DC-SRV2:

  • Устанавливаем node-exporter:
apt-get install prometheus-node_exporter -y
  • Запускаем службу 
systemctl enable --now prometheus-node_exporter

Docker:

  • Открываем на редактирование файл по пути /var/lib/docker/volumes/root_prom-configs/_data/prometheus.yml:
vim /var/lib/docker/volumes/root_prom-configs/_data/prometheus.yml
    • добавляем в конец информацию о нашем контейнере с node-exporter:

  • перезапустить контейнеры:
docker-compose -f monitoring.yml restart
  • Возвращаемся в веб-интерфейс prometheus:

  • Переходим в веб-интерфейс Grafana:

Последнее изменение: пятница, 14 июня 2024, 15:11