parent
3ef7c65962
commit
f6614533d7
@ -1,82 +0,0 @@
|
||||
# Лабораторная работа №2 - Разработка простейшего распределённого приложения
|
||||
|
||||
## Задание
|
||||
|
||||
**Цель**: Разработать два приложения, результат работы первого из которых становится входными данными для второго.
|
||||
|
||||
**Задачи**:
|
||||
1. Разработать два приложения:
|
||||
- **worker_1**: Считывает файл с целыми числами, умножает каждое число на 2 и сохраняет результат в новый файл.
|
||||
- **worker_2**: Считывает файл, созданный `worker_1`, вычисляет сумму чисел и выводит результат.
|
||||
2. Разработать файлы сборки Docker для каждого приложения.
|
||||
3. Собрать файл `docker-compose.yml` для запуска обоих приложений.
|
||||
4. Настроить монтирование директорий для обмена данными между контейнерами.
|
||||
5. Организовать генерацию входных данных с помощью скрипта `data_gen.py`.
|
||||
6. Правильно закоммитить решение с использованием `.gitignore` для исключения лишних файлов.
|
||||
|
||||
## Описание решения
|
||||
|
||||
### Программы
|
||||
|
||||
1. **data_generator/data_gen.py**:
|
||||
- Генерирует случайные целые числа и сохраняет их в файл `input.txt` в папке `data`.
|
||||
|
||||
2. **worker_1/app.py**:
|
||||
- Читает файл `input.txt`, умножает числа на 2 и сохраняет результат в `output_worker1.txt`.
|
||||
|
||||
3. **worker_2/app.py**:
|
||||
- Читает файл `output_worker1.txt`, вычисляет сумму чисел и выводит результат на экран.
|
||||
|
||||
### Генерация данных
|
||||
|
||||
Скрипт `data_gen.py` создаёт файл `input.txt` с 20 случайными числами в диапазоне от 1 до 100. Если папка `data` отсутствует, скрипт создаёт её автоматически.
|
||||
|
||||
### Docker
|
||||
|
||||
1. **Dockerfile для `worker_1`**:
|
||||
- Устанавливает Python.
|
||||
- Копирует скрипт `app.py`.
|
||||
- Устанавливает рабочую директорию `/app`.
|
||||
- Запускает `app.py`.
|
||||
|
||||
2. **Dockerfile для `worker_2`**:
|
||||
- Устанавливает Python.
|
||||
- Копирует скрипт `app.py`.
|
||||
- Устанавливает рабочую директорию `/app`.
|
||||
- Запускает `app.py`.
|
||||
|
||||
### Docker Compose
|
||||
|
||||
Файл `docker-compose.yml` управляет запуском трёх сервисов:
|
||||
1. **data_generator** — генерирует входные данные.
|
||||
2. **worker_1** — обрабатывает данные из `input.txt` и создаёт `output_worker1.txt`.
|
||||
3. **worker_2** — читает `output_worker1.txt`, вычисляет сумму чисел и выводит результат.
|
||||
|
||||
Монтирование директорий обеспечивает обмен файлами между контейнерами.
|
||||
|
||||
### Сборка и запуск
|
||||
|
||||
1. Генерация данных:
|
||||
```
|
||||
docker-compose run data_generator
|
||||
```
|
||||
2. Запуск всех сервисов:
|
||||
```
|
||||
docker-compose up --build
|
||||
```
|
||||
|
||||
### Результаты
|
||||
|
||||
После выполнения команд:
|
||||
- **input.txt** — файл, созданный `data_generator`, содержащий случайные числа.
|
||||
- **output_worker1.txt** — файл, созданный `worker_1`, содержащий числа, умноженные на 2.
|
||||
- Конечный результат (сумма чисел) выводится в консоль `worker_2`.
|
||||
|
||||
## Вывод
|
||||
|
||||
В результате лабораторной работы было создано простейшее распределённое приложение с использованием Docker и Docker Compose. Реализация демонстрирует базовые подходы к созданию контейнеризированных приложений, обмену данными между контейнерами и автоматизации обработки данных.
|
||||
|
||||
**Видео демонстрации**:
|
||||
|
||||
Ссылка: https://cloud.mail.ru/public/83jj/3fGCcVQcK
|
||||
|
@ -1,14 +0,0 @@
|
||||
import random
|
||||
import os
|
||||
|
||||
def generate_data(file_path, count=10):
|
||||
# Создаём директорию, если она не существует
|
||||
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
||||
|
||||
with open(file_path, "w") as f:
|
||||
numbers = [str(random.randint(1, 100)) for _ in range(count)]
|
||||
f.write("\n".join(numbers))
|
||||
|
||||
if __name__ == "__main__":
|
||||
generate_data("../data/input.txt", count=20)
|
||||
print("Data generated successfully in 'data/input.txt'")
|
@ -1,25 +0,0 @@
|
||||
version: "3.9"
|
||||
services:
|
||||
data_generator:
|
||||
image: python:3.10-slim
|
||||
volumes:
|
||||
- ./data_generator:/app
|
||||
- ./data:/data
|
||||
working_dir: /app
|
||||
command: python data_gen.py
|
||||
|
||||
worker_1:
|
||||
build:
|
||||
context: ./worker_1
|
||||
volumes:
|
||||
- ./data:/data
|
||||
depends_on:
|
||||
- data_generator
|
||||
|
||||
worker_2:
|
||||
build:
|
||||
context: ./worker_2
|
||||
volumes:
|
||||
- ./data:/data
|
||||
depends_on:
|
||||
- worker_1
|
@ -1,4 +0,0 @@
|
||||
FROM python:3.10-slim
|
||||
WORKDIR /app
|
||||
COPY app.py /app
|
||||
CMD ["python", "app.py"]
|
@ -1,12 +0,0 @@
|
||||
def process_data(input_file, output_file):
|
||||
with open(input_file, "r") as f:
|
||||
numbers = [int(line.strip()) for line in f.readlines()]
|
||||
|
||||
processed_numbers = [n * 2 for n in numbers]
|
||||
|
||||
with open(output_file, "w") as f:
|
||||
f.write("\n".join(map(str, processed_numbers)))
|
||||
|
||||
if __name__ == "__main__":
|
||||
process_data("/data/input.txt", "/data/output_worker1.txt")
|
||||
print("Worker 1 processing complete.")
|
@ -1,4 +0,0 @@
|
||||
FROM python:3.10-slim
|
||||
WORKDIR /app
|
||||
COPY app.py /app
|
||||
CMD ["python", "app.py"]
|
@ -1,9 +0,0 @@
|
||||
def calculate_sum(input_file):
|
||||
with open(input_file, "r") as f:
|
||||
numbers = [int(line.strip()) for line in f.readlines()]
|
||||
|
||||
total = sum(numbers)
|
||||
print(f"The sum of the processed numbers is: {total}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
calculate_sum("/data/output_worker1.txt")
|
Loading…
Reference in New Issue
Block a user