Compare commits

...

17 Commits

Author SHA1 Message Date
c8adabc38a tukaeva_alfiya_lab_2 is ready 2024-09-24 20:24:14 +04:00
3d98388a13 tukaeva_alfiya_lab_1 is ready 2024-09-18 23:09:14 +04:00
f980a74f5e Merge pull request 'emelyanov_artem_lab_1' (#7) from emelyanov_artem_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#7
2024-09-17 14:55:50 +04:00
e10ae36577 Merge pull request 'borschevskaya_anna_lab_1' (#6) from borschevskaya_anna_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#6
2024-09-17 14:54:05 +04:00
46b8ecfc54 Merge pull request 'vaksman_valerya_lab_1' (#5) from vaksman_valerya_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#5
2024-09-17 14:52:42 +04:00
262193a301 Merge pull request 'tsukanova_irina_lab_1' (#3) from tsukanova_irina_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#3
2024-09-17 14:36:47 +04:00
48711e14e3 Merge pull request 'kuzarin_maxim_lab_1' (#2) from kuzarin_maxim_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#2
2024-09-17 14:11:50 +04:00
39664ac3a1 Merge pull request 'dozorova_alena_lab_1 is ready' (#1) from dozorova_alena_lab_1 into main
Reviewed-on: Alexey/DAS_2024_1#1
2024-09-17 14:10:20 +04:00
7af877c37a feature: completed lab 1 2024-09-17 13:08:06 +04:00
7d2ae7430d is super duper ready 2024-09-15 21:59:03 +04:00
ec21e89033 borschevskaya_anna_lab_1 is ready 2024-09-15 21:51:58 +04:00
afddfcf91f is super ready 2024-09-15 21:36:13 +04:00
9b0cb3582d ready 2024-09-15 21:34:49 +04:00
37080832d5 is ready 2024-09-15 21:23:41 +04:00
39fdc511ee Init commit. 2024-09-15 19:23:41 +04:00
2714d4e718 tsukanova_irina_lab_1 is ready 2024-09-15 16:18:03 +04:00
4af4abcb7f dozorova_alena_lab_1 is ready 2024-09-13 23:02:10 +04:00
22 changed files with 418 additions and 74 deletions

View File

@@ -1,14 +0,0 @@
# Переменные для базы данных
POSTGRES_TAG=latest # Берём последнююю версию postgres. Пока это не принципиально
POSTGRES_DATA_DIR=./postgres-data
POSTGRES_PASSWORD=postgres_password
# Переменные для Web gui для БД
DB_GUI_IMAGE=adminer # Самый легковесный Web gui для postgres(и не только)
DB_GUI_CONTEINER_PORT=8080
# Переменные для брокера сообщения RabbitMQ
RABBIT_TAG=3.10.7-management # Тут есть встроенный Web интерфейс
RABBIT_DATA_DIR=./rabbit-data
RABBIT_USERNAME=user
RABBIT_PASSWORD=password

View File

@@ -1,2 +0,0 @@
postgres-data/
rabbit-data/

View File

@@ -1,27 +0,0 @@
# Лабораторная работа 1
Данная работа посвящена работе с docker compose и поднятию сервисов, необходимых для последующего выполнения работ.
## Описание
В качестве сервисов были выбраны:
- СУБД - Postgres
- Web интерфейс для БД Postgres - Adminer
- Брокер сообщений - RabbitMQ (+ Web интерфейс)
## Запуск
Для запуска лабораторной работы необходимо иметь запущенный движок Docker на устройстве.
Необходимо перейти в папку, где располагается данный файл. Далее открыть терминал и ввести команду:
```
docker compose up -d
```
В данном случае флаг `-d` не обязателен. Он лишь позволит оставить консоль интерактивной (запускает все контейнеры в фоновом режиме).
В случае, если в консоли отобразился подобный текст и появилась возможность вводить команды - сервисы успешно запущены.
```
[+] Running 4/4
✔ Network kuzarin_maxim_lab_1_default Created 0.0s
✔ Container kuzarin_maxim_lab_1-db-1 Started 0.7s
✔ Container kuzarin_maxim_lab_1-rabbit-1 Started 0.7s
✔ Container kuzarin_maxim_lab_1-db_web_gui-1 Started 0.7s
```
## Описание compose файла
В docker-compose файле все уникальные строчки помечены комментариями. Они описывают их предназначения, и иногда обосновывают принятые решения.
Так же комментарии присутствуют в файле .env, где хранятся переменные среды, нужные для работы compose файла.
## Видео демонстрация
Был записан видеоролик, демонстрирующий процесс запуска и работы сервисов. Он расположен по [адресу](https://drive.google.com/file/d/1ouUc-3eYhaJIR0HhD4b_Lj73oxEqORpA/view?usp=sharing)

View File

@@ -1,31 +0,0 @@
services:
db: # База данных
image: postgres:${POSTGRES_TAG} # Берём тег образа из переменной среды
restart: always # Автоматический перезапуск контейнера, если он упал
ports: # проброс портов
- 5432:5432 # Так как на хосте нет postgres, порт по умолчанию можно использовать свободно
volumes: # Указываем проброс папок
- ${POSTGRES_DATA_DIR}:/var/lib/postgresql/data # Данные postgres хранятся в /var/lib/postgresql/data.
# А на хосте монтируем туда, куда указано в переменной
environment: # Указываем переменные среды
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} # Пароль от учётки postgres берём из переменных среды
db_web_gui: # Интерфейс для доступа к БД (на компе нет PgAdmin)
image: ${DB_GUI_IMAGE} # Их есть много разных, так что имя образа из env
restart: always
ports:
- 8080:${DB_GUI_CONTEINER_PORT} # Так как Web GUI разные, то и порт может быть разный. Берём из env
rabbit: # Rabbit тоже понадобится в будущем
image: rabbitmq:${RABBIT_TAG} # Определяем тегом версию
restart: always
ports:
- 5672:5672 # Это порт доступа к брокеру (если буду разрабатывать на локале)
- 8081:15672 # А это порт для Web GUI. Для удобста на хосте это 8081, близко к БД
volumes:
- ${RABBIT_DATA_DIR}:/var/lib/rabbitmq # У Rabbit так же можно пробросить папку, чтобы не терять данные
environment:
RABBITMQ_DEFAULT_USER: ${RABBIT_USERNAME} # Логин для пользователя Rabbit Берём из env
RABBITMQ_DEFAULT_PASS: ${RABBIT_PASSWORD} # Пароль для пользователя Rabbit. Берём из env

View File

@@ -0,0 +1,4 @@
DB_HOST = wp_database
DB_USER = wordpress
DB_PASSWORD = wordpress
DB_NAME = wordpress

View File

@@ -0,0 +1,13 @@
FROM wordpress:latest
# Установка WP-CLI
RUN apt-get update && apt-get install -y less \
&& curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
&& chmod +x wp-cli.phar \
&& mv wp-cli.phar /usr/local/bin/wp
# Копируем скрипт entrypoint
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

View File

@@ -0,0 +1,137 @@
# Лабораторная работа №1 - Знакомство с docker и docker-compose
## Задание
Нужно развернуть 3 сервиса в контейнерах docker через docker-compose.
Необходимые требования:
* Несколько контейнеров.
* Хотя бы один volume.
* Хотя бы один порт, проброшенный на хост.
* Разворачивание системы должно пройти до конца.
## Запуск ЛР:
Введем в терминале команду:
```
docker-compose up -d
```
## Использованные сервисы:
 1. ```db``` - база данные MySQL
 2. ```redmine``` - Система учёта багов, т.е. баг-трекер.
 3. ```mediawiki``` - движок вики
 4. ```wordpress``` - платформа для управления контентом
## Описание программы:
Развернутые сервисы:
### wordpress
```
wordpress: # Определение сервиса WordPress
image: wordpress:latest # Используемый образ WordPress последней версии
containername: wp_app # Имя контейнера
restart: always
ports: # Настройка портов
- "8000:80"
environment: # Переменные окружения
WORDPRESSDBHOST: ${DBHOST}
WORDPRESSDBUSER: ${DBUSER}
WORDPRESSDBPASSWORD: ${DBPASSWORD}
WORDPRESSDBNAME: ${DBNAME}
WORDPRESSADMINUSER: admin
WORDPRESSADMINPASSWORD: adminpassword
WORDPRESSADMINEMAIL: admin@example.com
volumes: # Настройка томов
- wordpress_data:/var/www/html
dependson: # Зависимости
- db_wordpress # Зависит от сервиса MySQL
```
Эта строка отвечает за образ сброки:
```
image: wordpress:latest
```
Задание имени контейнера:
```
containername: wp_app
```
Проброс портов:
```
ports:
- 8000:80
```
Тома для хранения данных:
```
volumes:
- wordpress_data:/var/www/html
```
Переменные окружения
```
environment:
WORDPRESSDBHOST: ${DBHOST}
WORDPRESSDBUSER: ${DBUSER}
WORDPRESSDBPASSWORD: ${DBPASSWORD}
WORDPRESSDBNAME: ${DBNAME}
WORDPRESSADMINUSER: admin
WORDPRESSADMINPASSWORD: adminpassword
WORDPRESSADMINEMAIL: admin@example.com
```
Зависимости
```
dependson:
- db_wordpress
```
Аналогично со другими сервисами:
### mediawiki
```
mediawiki: # Определение сервиса MediaWiki
image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35
ports: # Настройка портов
- "8080:80"
containername: mediawiki # Имя контейнера
volumes: # Настройка томов
- mediawiki_data:/var/www/html/images mediawiki: # Определение сервиса MediaWiki
image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35
ports: # Настройка портов
- "8080:80"
containername: mediawiki # Имя контейнера
volumes: # Настройка томов
- mediawiki_data:/var/www/html/images
```
### redmine
```
redmine: # Определение сервиса Redmine
image: redmine:latest # Используемый образ Redmine последней версии
containername: redmine # Имя контейнера
ports: # Настройка портов
- "3000:3000"
volumes: # Настройка томов
- redmine_data:/usr/src/redmine/files
```
# Скрины работы программы:
Панель консоли
![](lab_1.png "")
# Видео
https://vk.com/video230744264_456239102

View File

@@ -0,0 +1,53 @@
services:
mediawiki: # Определение сервиса MediaWiki
image: mediawiki:1.35 # Используемый образ MediaWiki версии 1.35
ports: # Настройка портов
- "8080:80"
containername: mediawiki # Имя контейнера
volumes: # Настройка томов
- mediawiki_data:/var/www/html/images
db_wordpress: # Определение сервиса MySQL для WordPress
image: mysql:5.7 # Используемый образ MySQL версии 5.7
containername: wp_database # Имя контейнера
environment: # Переменные окружения
MYSQLROOTPASSWORD: rootsecret
MYSQLDATABASE: ${DBNAME}
MYSQLUSER: ${DBUSER}
MYSQLPASSWORD: ${DBPASSWORD}
volumes: # Настройка томов
- db_wordpress_data:/var/lib/mysql
wordpress: # Определение сервиса WordPress
image: wordpress:latest # Используемый образ WordPress последней версии
containername: wp_app # Имя контейнера
restart: always
ports: # Настройка портов
- "8000:80"
user: www-data
environment: # Переменные окружения
WORDPRESSDBHOST: ${DBHOST}
WORDPRESSDBUSER: ${DBUSER}
WORDPRESSDBPASSWORD: ${DBPASSWORD}
WORDPRESSDBNAME: ${DBNAME}
WORDPRESSADMINUSER: admin
WORDPRESSADMINPASSWORD: adminpassword
WORDPRESSADMINEMAIL: admin@example.com
volumes: # Настройка томов
- wordpress_data:/var/www/html
dependson: # Зависимости
- db_wordpress # Зависит от сервиса MySQL
redmine: # Определение сервиса Redmine
image: redmine:latest # Используемый образ Redmine последней версии
containername: redmine # Имя контейнера
ports: # Настройка портов
- "3000:3000"
volumes: # Настройка томов
- redmine_data:/usr/src/redmine/files
volumes: # Определение томов
mediawiki_data: # ТОМ для MediaWiki
wordpress_data: # ТОМ для WordPress
db_wordpress_data: # ТОМ для MySQL
redmine_data: # ТОМ для Redmine

View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -e
# Ожидание готовности базы данных
until wp db check; do
echo "Ожидание базы данных..."
sleep 5
done
# Установка WordPress
if ! wp core is-installed; then
wp core install --url="http://localhost:8000" --title="Библиотека" --admin_user="admin" --admin_password="admin_password" --admin_email="admin@example.com" --skip-email
fi
exec apache2-foreground

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

2
tukaeva_alfiya_lab_2/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
result/
data/

View File

@@ -0,0 +1,38 @@
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
## Задание
* Согласно вашему варианту разработать два приложения такие, что результат первого является исходными данными для второго.
* Изучить файлы сборки образов docker и разработать их для созданных приложений.
* Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы.
## Выбранные варианты:
 1. Формирует файл /var/result/data.txt так, что каждая строка файла - количество символов в именах файлов из каталога /var/data.
 2. Ищет набольшее число из файла /var/result/data.txt и сохраняет количество таких чисел из последовательности в /var/result/result.txt.
## Запуск ЛР:
Введем в терминале команду:
```
docker compose up --build
```
После ввода данной команды происходит запуск файла generate_files.py.
Он формирует файлы в директории /var/result, которые нужны для работы приложений.
![](lab_2.1.png "")
Далее запускается первое приложение app_1.py. Оно считает количество символов в именах файлов, которые мы создали ранее, и записывает в файл /var/result/data.txt.
![](lab_2.2.png "")
После этого, запускается 2 приложение app_2.py. Оно Ищет набольшее число из файла /var/result/data.txt и сохраняет количество таких чисел из последовательности в файл /var/result/result.txt.
![](lab_2.3.png "")
# Видео
https://vk.com/video230744264_456239103?list=ln-8jtmxasFoP743qLzKB

View File

@@ -0,0 +1,8 @@
FROM python:latest
WORKDIR /app
COPY app_1.py /app/
CMD ["python", "app_1.py"]

View File

@@ -0,0 +1,27 @@
import os
def count_file_name_lengths(source_dir, result_file):
# Проверяем и создаем директорию для результатов
result_dir = os.path.dirname(result_file)
if not os.path.exists(result_dir):
os.makedirs(result_dir)
print(f"Created directory {result_dir}")
# Поиск файлов в исходной директории
files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]
# Если файлы не найдены, выводим сообщение
if not files:
print(f"No files found in {source_dir}")
return
# Запись длин имен файлов в result_file
with open(result_file, 'w') as f_out:
for file in files:
f_out.write(f"{len(file)}\n")
print(f"Wrote file name lengths to {result_file}")
if __name__ == '__main__':
count_file_name_lengths('/var/data', '/var/result/data.txt')

View File

@@ -0,0 +1,8 @@
FROM python:latest
WORKDIR /app
COPY app_2.py /app/
CMD ["python","app_2.py"]

View File

@@ -0,0 +1,34 @@
import os
def count_max_numbers(source_file, result_file):
# Проверяем и создаем директорию для результатов
result_dir = os.path.dirname(result_file)
if not os.path.exists(result_dir):
os.makedirs(result_dir)
print(f"Created directory {result_dir}")
# Чтение чисел из source_file
try:
with open(source_file, 'r') as f:
numbers = [int(line.strip()) for line in f if line.strip().isdigit()]
except FileNotFoundError:
print(f"File not found: {source_file}")
return
if not numbers:
print(f"No valid numbers found in {source_file}")
return
# Находим максимум
max_number = max(numbers)
max_count = numbers.count(max_number)
# Записываем количество максимальных чисел в result_file
with open(result_file, 'w') as f_out:
f_out.write(f"{max_count}")
print(f"Wrote count of max number {max_number} to {result_file}")
if __name__ == "__main__":
count_max_numbers('/var/result/data.txt', '/var/result/result.txt')

View File

@@ -0,0 +1,33 @@
services:
generator:
build: ./generator
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data в контейнере
entrypoint: ["sh", "-c", "if [ -z \"$(ls -A /var/data)\" ]; then python generate_files.py; else echo '/var/data is not empty'; fi"] # Запуск команды, проверяющей, пуста ли папка /var/data. Если пуста, запускается скрипт генерации данных.
app_1:
build: ./app_1
image: app_1
container_name: app_1
volumes:
- ./data:/var/data # Монтирование локальной папки data в /var/data
- ./result:/var/result # Монтирование локальной папки result в /var/result
depends_on:
- generator
app_2:
build: ./app_2
image: app_2
depends_on:
- app_1
container_name: app_2
volumes:
- shared-result:/var/result
- ./data:/var/data # Монтирование локальной папки data в /var/data
- ./result:/var/result # Монтирование локальной папки result в /var/result
volumes:
shared-result:

View File

@@ -0,0 +1,11 @@
FROM python:latest
# задание рабочей директории внутри контейнера.
WORKDIR /app
# перемещение файлов из хоста в контейнер.
COPY generate_files.py /app/
# команда, выполняющаяся при запуске контейнера.
CMD ["python", "generate_files.py"]

View File

@@ -0,0 +1,35 @@
import os
import random
import string
def generate_random_filename(length):
#Генерирует случайное имя файла с длиной length.
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) + '.txt'
def generate_data_files(directory, num_files, min_lines, max_lines):
# Создание директории, если таковой не существует
if not os.path.exists(directory):
os.makedirs(directory)
# Проверка, пустая ли директория
if os.listdir(directory):
print(f"{directory} is not empty, skipping file generation.")
return
# Генерация файлов
for _ in range(num_files):
file_name = generate_random_filename(random.randint(5, 20)) # Длина имени файла от 5 до 20
file_path = os.path.join(directory, file_name)
# Создание пустого файла
open(file_path, 'w').close() # Открываем файл в режиме записи и сразу закрываем
print(f"Generated file: {file_path}")
if __name__ == "__main__":
# Генерация случайных файлов данных в директории /var/data
generate_data_files('/var/data', num_files=random.randint(5, 15), min_lines=1, max_lines=50)

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB