Homework
@@ -0,0 +1,432 @@
|
||||
# Домашнее задание по занятию "Docker. Часть 2" - Стадник Олег
|
||||
|
||||
[Итоговая конфигурация](/config/)
|
||||
|
||||
### Задание 1
|
||||
|
||||
Напишите ответ в свободной форме, не больше одного абзаца текста.
|
||||
|
||||
Установите Docker Compose и опишите, для чего он нужен и как может улучшить лично вашу жизнь.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Устанавливаем Docker Compose на Debian:
|
||||
|
||||

|
||||
|
||||
Docker Compose позволяет в одном файле описывать запуск необходимых сервисов (контейнеров), указывать их зависимости друг от друга и запускать эту конфигурацию с помощью команды ```docker compose up -d```. Я использовал Docker Compose в своих старых проектах для удобного разворачивания базы данных, бэкенда и фронтенда. Сейчас использую для разворачивания различных сервисов на домашнем сервере, например облачное хранилище фотографий Immich
|
||||
|
||||
---
|
||||
|
||||
### Задание 2
|
||||
|
||||
**Выполните действия и приложите текст конфига на этом этапе.**
|
||||
|
||||
Создайте файл docker-compose.yml и внесите туда первичные настройки:
|
||||
|
||||
* version;
|
||||
* services;
|
||||
* volumes;
|
||||
* networks.
|
||||
|
||||
При выполнении задания используйте подсеть 10.5.0.0/16.
|
||||
Ваша подсеть должна называться: <ваши фамилия и инициалы>-my-netology-hw.
|
||||
Все приложения из последующих заданий должны находиться в этой конфигурации.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Получившийся docker-compose.yaml файл:
|
||||
|
||||
```yaml
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
|
||||
volumes:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Задание 3
|
||||
|
||||
**Выполните действия:**
|
||||
|
||||
1. Создайте конфигурацию docker-compose для Prometheus с именем контейнера <ваши фамилия и инициалы>-netology-prometheus.
|
||||
2. Добавьте необходимые тома с данными и конфигурацией (конфигурация лежит в репозитории в директории [6-04/prometheus](https://github.com/netology-code/sdvps-homeworks/tree/main/lecture_demos/6-04/prometheus) ).
|
||||
3. Обеспечьте внешний доступ к порту 9090 c докер-сервера.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Я использовал образ prom/prometheus. Пробросил конфиг из материалов задания в ```/etc/prometheus/prometheus.yml``` и для основной папки prometheus сделал том prometheus-data
|
||||
|
||||
Получившийся docker-compose.yaml файл:
|
||||
|
||||
```yaml
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
container_name: stadnikoe-netology-prometheus
|
||||
image: prom/prometheus:latest
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- '9090:9090'
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Задание 4
|
||||
|
||||
**Выполните действия:**
|
||||
|
||||
1. Создайте конфигурацию docker-compose для Pushgateway с именем контейнера <ваши фамилия и инициалы>-netology-pushgateway.
|
||||
2. Обеспечьте внешний доступ к порту 9091 c докер-сервера.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Использовал образ prom/pushgateway
|
||||
Получившийся docker-compose.yaml файл:
|
||||
|
||||
```yaml
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
container_name: stadnikoe-netology-prometheus
|
||||
image: prom/prometheus:latest
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- '9090:9090'
|
||||
pushgateway:
|
||||
container_name: stadnikoe-netology-pushgateway
|
||||
image: prom/pushgateway:latest
|
||||
ports:
|
||||
- '9091:9091'
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Задание 5
|
||||
|
||||
**Выполните действия:**
|
||||
|
||||
1. Создайте конфигурацию docker-compose для Grafana с именем контейнера <ваши фамилия и инициалы>-netology-grafana.
|
||||
2. Добавьте необходимые тома с данными и конфигурацией (конфигурация лежит в репозитории в директории [6-04/grafana](https://github.com/netology-code/sdvps-homeworks/blob/main/lecture_demos/6-04/grafana/custom.ini).
|
||||
3. Добавьте переменную окружения с путем до файла с кастомными настройками (должен быть в томе), в самом файле пропишите логин=<ваши фамилия и инициалы> пароль=netology.
|
||||
4. Обеспечьте внешний доступ к порту 3000 c порта 80 докер-сервера.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Скачал custom.ini, поменял имя пользователя и поместил в директорию grafana рядом с docker-compose.yaml
|
||||
|
||||

|
||||
|
||||
Использовал образ grafana/grafana. Пробросил файл custom.ini в ```/etc/grafana/custom.ini``` и для переменной окружения указал этот проброшенный файл. Для основной папки ```/var/lib/grafana``` создал том grafana-data
|
||||
Получившийся docker-compose.yaml файл:
|
||||
```yaml
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
container_name: stadnikoe-netology-prometheus
|
||||
image: prom/prometheus:latest
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- '9090:9090'
|
||||
pushgateway:
|
||||
container_name: stadnikoe-netology-pushgateway
|
||||
image: prom/pushgateway:latest
|
||||
ports:
|
||||
- '9091:9091'
|
||||
grafana:
|
||||
container_name: stadnikoe-netology-grafana
|
||||
image: grafana/grafana:latest
|
||||
volumes:
|
||||
- ./grafana/custom.ini:/etc/grafana/custom.ini
|
||||
- grafana-data:/var/lib/grafana
|
||||
environment:
|
||||
- GF_PATHS_CONFIG=/etc/grafana/custom.ini
|
||||
ports:
|
||||
- '80:3000'
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
grafana-data:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Задание 6
|
||||
|
||||
**Выполните действия.**
|
||||
|
||||
1. Настройте поочередность запуска контейнеров.
|
||||
2. Настройте режимы перезапуска для контейнеров.
|
||||
3. Настройте использование контейнерами одной сети.
|
||||
4. Запустите сценарий в detached режиме.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Добавил такую очередность запуска контейнеров с помощью depends_on: pushgateway -> prometheus -> grafana
|
||||
Для режимов перезапуска поставил restart: unless-stopped. Контейнеры в таком режиме всегда будут перезапускаться пока я сам их не остановлю.
|
||||
Добавил использование созданной сети для контейнеров с помощью networks.
|
||||
|
||||
Получившийся docker-compose.yaml файл:
|
||||
```yaml
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
container_name: stadnikoe-netology-prometheus
|
||||
image: prom/prometheus:latest
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- '9090:9090'
|
||||
depends_on:
|
||||
- pushgateway
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
pushgateway:
|
||||
container_name: stadnikoe-netology-pushgateway
|
||||
image: prom/pushgateway:latest
|
||||
ports:
|
||||
- '9091:9091'
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
grafana:
|
||||
container_name: stadnikoe-netology-grafana
|
||||
image: grafana/grafana:latest
|
||||
volumes:
|
||||
- ./grafana/custom.ini:/etc/grafana/custom.ini
|
||||
- grafana-data:/var/lib/grafana
|
||||
environment:
|
||||
- GF_PATHS_CONFIG=/etc/grafana/custom.ini
|
||||
ports:
|
||||
- '80:3000'
|
||||
depends_on:
|
||||
- prometheus
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
grafana-data:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
```
|
||||
|
||||
Запускаю конфигурацию в detached режиме:
|
||||
|
||||

|
||||
|
||||
Проверяем доступность prometheus:
|
||||
|
||||

|
||||
|
||||
Проверяем работу pushgateway:
|
||||
|
||||

|
||||
|
||||
Проверяем работу Grafana. Входим в систему:
|
||||
|
||||

|
||||
|
||||
Открывается дашборд:
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Задание 7
|
||||
|
||||
**Выполните действия.**
|
||||
1. Выполните запрос в Pushgateway для помещения метрики <ваши фамилия и инициалы> со значением 5 в Prometheus: ```echo "<ваши фамилия и инициалы> 5" | curl --data-binary @- http://localhost:9091/metrics/job/netology```.
|
||||
2. Залогиньтесь в Grafana с помощью логина и пароля из предыдущего задания.
|
||||
3. Cоздайте Data Source Prometheus (Home -> Connections -> Data sources -> Add data source -> Prometheus -> указать "Prometheus server URL = http://prometheus:9090" -> Save & Test).
|
||||
4. Создайте график на основе добавленной в пункте 5 метрики (Build a dashboard -> Add visualization -> Prometheus -> Select metric -> Metric explorer -> <ваши фамилия и инициалы -> Apply.
|
||||
|
||||
В качестве решения приложите:
|
||||
|
||||
* docker-compose.yml **целиком**;
|
||||
* скриншот команды docker ps после запуске docker-compose.yml;
|
||||
* скриншот графика, постоенного на основе вашей метрики.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
docker-compose.yaml не менялся с предыдущего задания
|
||||
|
||||
Результат docker ps:
|
||||

|
||||
|
||||
График с моей фамилией и инициалами:
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Задание 8
|
||||
|
||||
**Выполните действия:**
|
||||
|
||||
1. Остановите и удалите все контейнеры одной командой.
|
||||
|
||||
В качестве решения приложите скриншот консоли с проделанными действиями.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Задание 9*
|
||||
|
||||
**Выполните действия:**
|
||||
|
||||
1. Создайте конфигурацию docker-compose для Alertmanager с именем контейнера <ваши фамилия и инициалы>-netology-alertmanager.
|
||||
2. Добавьте необходимые тома с данными и [конфигурацией](https://github.com/netology-code/sdvps-homeworks/tree/main/6-04/alertmanager), сеть, режим и очередность запуска.
|
||||
3. Обновите конфигурацию Prometheus (необходимые изменения ищите в презентации или документации) и перезапустите его.
|
||||
4. Обеспечьте внешний доступ к порту 9093 c докер-сервера.
|
||||
|
||||
В качестве решения приложите скриншот с событием из Alertmanager.
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
|
||||
Использовал образ prom/alertmanager. Пробросил конфиг из материалов задания в ```/etc/alertmanager/alertmanager.yml``` и для основной папки alertmanager сделал том alertmanager-data. Добавил в зависимости prometheus этот контейнер, чтобы он запускался до prometheus вместе с pushgateway.
|
||||
|
||||
```yaml
|
||||
alertmanager:
|
||||
container_name: stadnikoe-netology-alertmanager
|
||||
image: prom/alertmanager:latest
|
||||
volumes:
|
||||
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
|
||||
- alertmanager-data:/alertmanager
|
||||
ports:
|
||||
- '9093:9093'
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
```
|
||||
|
||||
Убрал комментарий с alertmanager из конфига prometheus, а также создал файл с тестовым правилом example_rule.yml, который пробросил в контейнер prometheus по пути ```/etc/prometheus/example_rule.yml```
|
||||
|
||||

|
||||
|
||||
Содержимое файла example_rule.yml:
|
||||
|
||||

|
||||
|
||||
Событие в Alertmanager:
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
### Задание 10*
|
||||
|
||||
Запустите свой сценарий на чистом железе без предзагруженных образов.
|
||||
|
||||
**Ответьте на вопросы в свободной форме:**
|
||||
|
||||
1. Опишите выполненный вами процесс развертывания сценария.
|
||||
2. Как вы думаете зачем может понадобиться такой способ развертывания?
|
||||
|
||||
---
|
||||
|
||||
### Решение
|
||||
#### 1.
|
||||
Устанавливаю docker на новой машине:
|
||||
|
||||

|
||||
|
||||
Переношу конфигурацию с прошлой машины:
|
||||
|
||||

|
||||
|
||||
Запуск конфигурации:
|
||||
|
||||

|
||||
|
||||
Проверка Grafana на новой машине:
|
||||
|
||||

|
||||
|
||||
#### 2.
|
||||
Это позволяет воспроизводить сервисы на другой хост в несколько команд, нужно только установить docker. А дальше Docker сам установит нужные зависимости и запустит контейнеры, которые ничем не отличаются от прошлого хоста.
|
||||
@@ -0,0 +1,16 @@
|
||||
route:
|
||||
group_by: ['alertname']
|
||||
group_wait: 30s
|
||||
group_interval: 1m
|
||||
repeat_interval: 1h
|
||||
receiver: 'web.hook'
|
||||
receivers:
|
||||
- name: 'web.hook'
|
||||
webhook_configs:
|
||||
- url: 'http://127.0.0.1:5001/'
|
||||
inhibit_rules:
|
||||
- source_match:
|
||||
severity: 'critical'
|
||||
target_match:
|
||||
severity: 'warning'
|
||||
equal: ['alertname', 'dev', 'instance']
|
||||
@@ -0,0 +1,66 @@
|
||||
version: '3.9'
|
||||
|
||||
services:
|
||||
prometheus:
|
||||
container_name: stadnikoe-netology-prometheus
|
||||
image: prom/prometheus:latest
|
||||
volumes:
|
||||
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
|
||||
- ./prometheus/example_rule.yml:/etc/prometheus/example_rule.yml
|
||||
- prometheus-data:/prometheus
|
||||
ports:
|
||||
- '9090:9090'
|
||||
depends_on:
|
||||
- pushgateway
|
||||
- alertmanager
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
pushgateway:
|
||||
container_name: stadnikoe-netology-pushgateway
|
||||
image: prom/pushgateway:latest
|
||||
ports:
|
||||
- '9091:9091'
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
grafana:
|
||||
container_name: stadnikoe-netology-grafana
|
||||
image: grafana/grafana:latest
|
||||
volumes:
|
||||
- ./grafana/custom.ini:/etc/grafana/custom.ini
|
||||
- grafana-data:/var/lib/grafana
|
||||
environment:
|
||||
- GF_PATHS_CONFIG=/etc/grafana/custom.ini
|
||||
ports:
|
||||
- '80:3000'
|
||||
depends_on:
|
||||
- prometheus
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
alertmanager:
|
||||
container_name: stadnikoe-netology-alertmanager
|
||||
image: prom/alertmanager:latest
|
||||
volumes:
|
||||
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
|
||||
- alertmanager-data:/alertmanager
|
||||
ports:
|
||||
- '9093:9093'
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- stadnikoe-my-netology-hw
|
||||
|
||||
volumes:
|
||||
prometheus-data:
|
||||
grafana-data:
|
||||
alertmanager-data:
|
||||
|
||||
networks:
|
||||
stadnikoe-my-netology-hw:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.5.0.0/16
|
||||
gateway: 10.5.0.1
|
||||
@@ -0,0 +1,4 @@
|
||||
[security]
|
||||
|
||||
admin_user = stadnikoe
|
||||
admin_password = netology
|
||||
@@ -0,0 +1,10 @@
|
||||
groups:
|
||||
- name: example
|
||||
rules:
|
||||
- alert: AlwaysFiring
|
||||
expr: vector(1) == 1
|
||||
for: 0m
|
||||
labels:
|
||||
severity: warning
|
||||
annotations:
|
||||
summary: "Test Alert"
|
||||
@@ -0,0 +1,33 @@
|
||||
# my global config
|
||||
global:
|
||||
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
|
||||
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
|
||||
# scrape_timeout is set to the global default (10s).
|
||||
|
||||
# Alertmanager configuration
|
||||
alerting:
|
||||
alertmanagers:
|
||||
- static_configs:
|
||||
- targets:
|
||||
- alertmanager:9093
|
||||
|
||||
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
|
||||
rule_files:
|
||||
- "example_rule.yml"
|
||||
# - "first_rules.yml"
|
||||
# - "second_rules.yml"
|
||||
|
||||
# A scrape configuration containing exactly one endpoint to scrape:
|
||||
# Here it's Prometheus itself.
|
||||
scrape_configs:
|
||||
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
|
||||
# - job_name: "docker-server"
|
||||
# metrics_path defaults to '/metrics'
|
||||
# scheme defaults to 'http'.
|
||||
# static_configs:
|
||||
# - targets: ["172.17.0.1:9100"]
|
||||
|
||||
- job_name: 'pushgateway'
|
||||
honor_labels: true
|
||||
static_configs:
|
||||
- targets: ["pushgateway:9091"]
|
||||
|
After Width: | Height: | Size: 181 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 63 KiB |
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 702 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 108 KiB |
|
After Width: | Height: | Size: 32 KiB |
|
After Width: | Height: | Size: 184 KiB |
|
After Width: | Height: | Size: 81 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 322 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 151 KiB |
|
After Width: | Height: | Size: 159 KiB |