diff --git a/belyaeva_ekaterina_lab_2/README.md b/belyaeva_ekaterina_lab_2/README.md new file mode 100644 index 0000000..5fc2392 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/README.md @@ -0,0 +1,81 @@ +# Лабораторная работа №2 + +## Задание + +Цель: изучение техники создания простого распределённого приложения. + +Задачи: + +- Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго. +- Изучить файлы сборки образов docker и разработать их для созданных приложений. +- Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы. +- Правильно закоммитить результат без лишних файлов. +- Оформить pull request по правилам и отправить его на проверку. + +## Ход работы + +### Разворачивание сервисов: +Были разработаны два приложения на java: + +worker-1 - Формирует файл /var/result/data.txt из первых строк всех файлов каталога /var/data. +worker-2 - Ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt. + +### Исходные файлы + +Исходные файлы содержат целые числа. + +В /var/result/data.txt копируются числа из первых строк каждого файла - 1, 10, 5 + +В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10 + +Содержимое всех файлов показано в видео. + +### Dockerfile + +Для лр были созданы идентичные докер-файлы в обоих проектах: + +``` +FROM openjdk:17 +LABEL authors="tauri" + +RUN mkdir /var/data +RUN mkdir /var/result + +WORKDIR /app +COPY src /app/src + +RUN javac /app/src/Main.java + +CMD ["java", "-cp", "/app/src", "Main"] +``` +- FROM - выбор базового образа +- LABEL - метка, что автор - tauri +- RUN - создание директории внутри контейнера +- WORKDIR - установка рабочей директории для последующих команд +- COPY - копирование содержимого директории внутрь контейнера +- RUN - компиляция исходного кода Main.java внутри контейнера +- CMD - определение команды, которая выполняется при запуске контейнера. В данном случае происходит запуск программы на java и указывается пусть до Main.java + +### docker-compose.yml +``` +version: "3" #формат конфигурации Docker Compose версии 3 +services: #определение сервисов + worker1: + build: + context: /worker-1 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\data:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов + worker2: + depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск + - worker1 + build: + context: /worker-2 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\result:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов +``` + +Работоспособность и то, что контейнеры были успешно развернуты показано в видео: [lab2.mp4](lab2.mp4) \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/docker-compose.yml b/belyaeva_ekaterina_lab_2/docker-compose.yml new file mode 100644 index 0000000..1ea9e21 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3" #формат конфигурации Docker Compose версии 3 +services: #определение сервисов + worker1: + build: + context: /worker-1 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\data:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов + worker2: + depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск + - worker1 + build: + context: /worker-2 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\result:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/lab2.mp4 b/belyaeva_ekaterina_lab_2/lab2.mp4 new file mode 100644 index 0000000..12c45af Binary files /dev/null and b/belyaeva_ekaterina_lab_2/lab2.mp4 differ diff --git a/belyaeva_ekaterina_lab_2/var/data/txt1.txt b/belyaeva_ekaterina_lab_2/var/data/txt1.txt new file mode 100644 index 0000000..0bce9e3 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/var/data/txt1.txt @@ -0,0 +1,7 @@ +1 +2 +3 +4 +5 +6 +7 \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/var/data/txt2.txt b/belyaeva_ekaterina_lab_2/var/data/txt2.txt new file mode 100644 index 0000000..19f2acb --- /dev/null +++ b/belyaeva_ekaterina_lab_2/var/data/txt2.txt @@ -0,0 +1,4 @@ +10 +20 +30 +40 \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/var/data/txt3.txt b/belyaeva_ekaterina_lab_2/var/data/txt3.txt new file mode 100644 index 0000000..88952c3 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/var/data/txt3.txt @@ -0,0 +1,5 @@ +5 +10 +15 +20 +25 diff --git a/belyaeva_ekaterina_lab_2/var/result/data.txt b/belyaeva_ekaterina_lab_2/var/result/data.txt new file mode 100644 index 0000000..61952dc --- /dev/null +++ b/belyaeva_ekaterina_lab_2/var/result/data.txt @@ -0,0 +1,3 @@ +1 +10 +5 diff --git a/belyaeva_ekaterina_lab_2/var/result/result.txt b/belyaeva_ekaterina_lab_2/var/result/result.txt new file mode 100644 index 0000000..105d7d9 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/var/result/result.txt @@ -0,0 +1 @@ +100 \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/worker-1/Dockerfile b/belyaeva_ekaterina_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..24eff6e --- /dev/null +++ b/belyaeva_ekaterina_lab_2/worker-1/Dockerfile @@ -0,0 +1,12 @@ +FROM openjdk:17 +LABEL authors="tauri" + +RUN mkdir /var/data +RUN mkdir /var/result + +WORKDIR /app +COPY src /app/src + +RUN javac /app/src/Main.java + +CMD ["java", "-cp", "/app/src", "Main"] \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/worker-1/src/Main.java b/belyaeva_ekaterina_lab_2/worker-1/src/Main.java new file mode 100644 index 0000000..e6982dd --- /dev/null +++ b/belyaeva_ekaterina_lab_2/worker-1/src/Main.java @@ -0,0 +1,62 @@ +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + String directoryPath = "/var/data"; + String resultFilePath = "/var/result/data.txt"; + + File directory = new File(directoryPath); + File resultFile = new File(resultFilePath); + + try { + // Создаем новый файл-результат или перезаписываем существующий + resultFile.createNewFile(); + + // Получаем список всех файлов в указанном каталоге + File[] files = directory.listFiles(); + + // Проверяем, что каталог существует и содержит файлы + if (directory.exists() && files != null) { + // Создаем объект для записи данных в файл-результат + FileWriter fileWriter = new FileWriter(resultFile); + BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); + + // Проходимся по всем файлам в каталоге + for (File file : files) { + // Проверяем, что текущий объект - файл + if (file.isFile()) { + // Создаем объект для чтения данных из файла + FileReader fileReader = new FileReader(file); + BufferedReader bufferedReader = new BufferedReader(fileReader); + + // Читаем строку из файла и записываем ее в файл-результат + String line = bufferedReader.readLine(); + if (line != null) { + bufferedWriter.write(line); + bufferedWriter.newLine(); + } + + // Закрываем объекты чтения данных из файла + bufferedReader.close(); + fileReader.close(); + } + } + + // Закрываем объект для записи данных в файл-результат + bufferedWriter.close(); + fileWriter.close(); + + System.out.println("Файл /var/result/data.txt успешно создан."); + } else { + System.out.println("Указанный каталог не существует или не содержит файлы."); + } + } catch (IOException e) { + System.out.println("Ошибка при создании файла: " + e.getMessage()); + } + } +} diff --git a/belyaeva_ekaterina_lab_2/worker-2/Dockerfile b/belyaeva_ekaterina_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..24eff6e --- /dev/null +++ b/belyaeva_ekaterina_lab_2/worker-2/Dockerfile @@ -0,0 +1,12 @@ +FROM openjdk:17 +LABEL authors="tauri" + +RUN mkdir /var/data +RUN mkdir /var/result + +WORKDIR /app +COPY src /app/src + +RUN javac /app/src/Main.java + +CMD ["java", "-cp", "/app/src", "Main"] \ No newline at end of file diff --git a/belyaeva_ekaterina_lab_2/worker-2/src/Main.java b/belyaeva_ekaterina_lab_2/worker-2/src/Main.java new file mode 100644 index 0000000..145e693 --- /dev/null +++ b/belyaeva_ekaterina_lab_2/worker-2/src/Main.java @@ -0,0 +1,68 @@ +import java.io.*; +import java.util.*; +import java.lang.Math; + +public class Main { + public static void main(String[] args) { + String filePath = "/var/data/data.txt"; + String resultPath = "/var/result/result.txt"; + + try { + // Чтение чисел из файла + List numbers = readNumbersFromFile(filePath); + + // Поиск наибольшего числа + int maxNumber = findMaxNumber(numbers); + + // Вычисление второй степени + int squaredNumber = (int) Math.pow(maxNumber, 2); + + // Сохранение результата в файл + saveResultToFile(resultPath, squaredNumber); + + System.out.println("Наибольшее число: " + maxNumber); + System.out.println("Квадрат наибольшего числа: " + squaredNumber); + System.out.println("Результат сохранен в файле " + resultPath); + } catch (IOException e) { + System.out.println("Произошла ошибка при чтении/записи файла."); + e.printStackTrace(); + } + } + + // Метод для чтения чисел из файла + private static List readNumbersFromFile(String filePath) throws IOException { + List numbers = new ArrayList<>(); + + BufferedReader reader = new BufferedReader(new FileReader(filePath)); + String line; + + while ((line = reader.readLine()) != null) { + int number = Integer.parseInt(line.trim()); + numbers.add(number); + } + + reader.close(); + + return numbers; + } + + // Метод для поиска наибольшего числа в списке + private static int findMaxNumber(List numbers) { + int maxNumber = Integer.MIN_VALUE; + + for (int number : numbers) { + if (number > maxNumber) { + maxNumber = number; + } + } + + return maxNumber; + } + + // Метод для сохранения результата в файл + private static void saveResultToFile(String filePath, int result) throws IOException { + BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); + writer.write(String.valueOf(result)); + writer.close(); + } +}