This commit is contained in:
2026-08-16 14:29:05 +03:00
commit d756db807c
23 changed files with 561 additions and 0 deletions
+432
View File
@@ -0,0 +1,432 @@
# Домашнее задание по занятию "Docker. Часть 2" - Стадник Олег
[Итоговая конфигурация](/config/)
### Задание 1
Напишите ответ в свободной форме, не больше одного абзаца текста.
Установите Docker Compose и опишите, для чего он нужен и как может улучшить лично вашу жизнь.
---
### Решение
Устанавливаем Docker Compose на Debian:
![Установка Docker Compose](img/img01.png)
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
![custom.ini](img/img04.png)
Использовал образ 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 режиме:
![docker compose up -d](img/img07.png)
Проверяем доступность prometheus:
![Установка Docker Compose](img/img02.png)
Проверяем работу pushgateway:
![Pushgateway](img/img03.png)
Проверяем работу Grafana. Входим в систему:
![Логин в Grafana](img/img05.png)
Открывается дашборд:
![Grafana](img/img06.png)
---
### Задание 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:
![docker ps](img/img09.png)
График с моей фамилией и инициалами:
![Grafana Dashboard](img/img08.png)
---
### Задание 8
**Выполните действия:**
1. Остановите и удалите все контейнеры одной командой.
В качестве решения приложите скриншот консоли с проделанными действиями.
---
### Решение
![docker compose down](img/img10.png)
---
### Задание 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```
![prometheus config](img/img11.png)
Содержимое файла example_rule.yml:
![example_rule.yaml](img/img12.png)
Событие в Alertmanager:
![Alertmanager](img/img13.png)
---
### Задание 10*
Запустите свой сценарий на чистом железе без предзагруженных образов.
**Ответьте на вопросы в свободной форме:**
1. Опишите выполненный вами процесс развертывания сценария.
2. Как вы думаете зачем может понадобиться такой способ развертывания?
---
### Решение
#### 1.
Устанавливаю docker на новой машине:
![Установка docker](img/img14.png)
Переношу конфигурацию с прошлой машины:
![Перенос конфигурации](img/img15.png)
Запуск конфигурации:
![docker compose up -d](img/img16.png)
Проверка Grafana на новой машине:
![Grafana](img/img17.png)
#### 2.
Это позволяет воспроизводить сервисы на другой хост в несколько команд, нужно только установить docker. А дальше Docker сам установит нужные зависимости и запустит контейнеры, которые ничем не отличаются от прошлого хоста.
+16
View File
@@ -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']
+66
View File
@@ -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
+4
View File
@@ -0,0 +1,4 @@
[security]
admin_user = stadnikoe
admin_password = netology
+10
View File
@@ -0,0 +1,10 @@
groups:
- name: example
rules:
- alert: AlwaysFiring
expr: vector(1) == 1
for: 0m
labels:
severity: warning
annotations:
summary: "Test Alert"
+33
View File
@@ -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"]
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB