diff --git a/volkov_rafael_lab_2/README.md b/volkov_rafael_lab_2/README.md new file mode 100644 index 0000000..847a5cf --- /dev/null +++ b/volkov_rafael_lab_2/README.md @@ -0,0 +1,84 @@ +# Лабораторная работа №2 - Разработка простейшего распределенного приложения + +Цель: изучение техники создания простого распределенного приложения. + +Задачи: + +- Согласно вышему варианту (выбирайте любой) разработать два приложения такие, что результат первого является исходными данными для второго. +- Изучить файлы сборки образов docker и разработать их для созданных приложений. +- Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы. +- Правильно закоммитить результат без лишних файлов. +- Оформить pull request по правилам и отправить его на проверку. + +# Описание заданий двух приложений + +Вариант первого приложения(worker-1): 1 - Ищет в каталоге /var/data файл с наибольшим количеством строк и перекладывает его в /var/result/data.txt +Вариант второго приложения(worker-2): 0 - сохраняет произведение первого и последнего числа из файла /var/result/data.txt в /var/result/result.txt + +

+

Cтруктура проекта
+ +

+ +# Работа программы + +- Создано две директории: worker-1 и worker-2 для двух программ. +- Dockerfile для образов обоих программ. +

+

Worker-1 Dockerfile
+ +

+

+

Worker-2 Dockerfile
+ +

+- Содержимое в файлах в папке data +

+ +

+

+ +

+

+ +

+- Описание docker-compose: запускает контейнеры, реализует build для создания образов на основе dockerfile и у второго контейнера описавыется зависимость depends_on от первого контейнера, чтобы сначала запустился первый контейнер, а за ним запустился второй. Также описываются volumes, для монтирование папок data и result в контейнеры. +

+

docker-compose
+ +

+

+

Сборка и запуска контейнеров
+ +

+

+

Docker Desktop контейнеры и образы
+ +

+

+ +

+

+

Консоль первого воркера
+ +

+

+

Консоль второго воркера
+ +

+

+

Результат работы контейнера, папка result два файла data.txt и result.txt
+ +

+

+

Содержимое data.txt
+ +

+

+

Содержимое result.txt
+ +

+ +# Видео + +Видео с разбором лабораторной работы - https://drive.google.com/file/d/1-sLDH9PPFeHlEqzfLtcerbGs8sCALaxe/view?usp=sharing diff --git a/volkov_rafael_lab_2/data/f1.txt b/volkov_rafael_lab_2/data/f1.txt new file mode 100644 index 0000000..c093316 --- /dev/null +++ b/volkov_rafael_lab_2/data/f1.txt @@ -0,0 +1,3 @@ +11 12 13 +21 22 +31 34 diff --git a/volkov_rafael_lab_2/data/f2.txt b/volkov_rafael_lab_2/data/f2.txt new file mode 100644 index 0000000..5eafe8a --- /dev/null +++ b/volkov_rafael_lab_2/data/f2.txt @@ -0,0 +1,2 @@ +45 +23 78 diff --git a/volkov_rafael_lab_2/data/f3.txt b/volkov_rafael_lab_2/data/f3.txt new file mode 100644 index 0000000..799880b --- /dev/null +++ b/volkov_rafael_lab_2/data/f3.txt @@ -0,0 +1,4 @@ +52 345 +23 345 +23 67 +23 20 \ No newline at end of file diff --git a/volkov_rafael_lab_2/docker-compose.yml b/volkov_rafael_lab_2/docker-compose.yml new file mode 100644 index 0000000..9bdebda --- /dev/null +++ b/volkov_rafael_lab_2/docker-compose.yml @@ -0,0 +1,17 @@ +services: + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + volumes: + - D:\RVIP\volkov_rafael_lab_2\data:/var/data + - D:\RVIP\volkov_rafael_lab_2\result:/var/result + worker-2: + build: + context: /worker-2 + dockerfile: Dockerfile + volumes: + - D:\RVIP\volkov_rafael_lab_2\data:/var/data + - D:\RVIP\volkov_rafael_lab_2\result:/var/result + depends_on: + - worker-1 \ No newline at end of file diff --git a/volkov_rafael_lab_2/result/data.txt b/volkov_rafael_lab_2/result/data.txt new file mode 100644 index 0000000..799880b --- /dev/null +++ b/volkov_rafael_lab_2/result/data.txt @@ -0,0 +1,4 @@ +52 345 +23 345 +23 67 +23 20 \ No newline at end of file diff --git a/volkov_rafael_lab_2/result/result.txt b/volkov_rafael_lab_2/result/result.txt new file mode 100644 index 0000000..487d273 --- /dev/null +++ b/volkov_rafael_lab_2/result/result.txt @@ -0,0 +1 @@ +1040 \ No newline at end of file diff --git a/volkov_rafael_lab_2/screens/img1.png b/volkov_rafael_lab_2/screens/img1.png new file mode 100644 index 0000000..8a47962 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img1.png differ diff --git a/volkov_rafael_lab_2/screens/img10.png b/volkov_rafael_lab_2/screens/img10.png new file mode 100644 index 0000000..9de369e Binary files /dev/null and b/volkov_rafael_lab_2/screens/img10.png differ diff --git a/volkov_rafael_lab_2/screens/img11.png b/volkov_rafael_lab_2/screens/img11.png new file mode 100644 index 0000000..25e0f43 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img11.png differ diff --git a/volkov_rafael_lab_2/screens/img12.png b/volkov_rafael_lab_2/screens/img12.png new file mode 100644 index 0000000..8a8e2e0 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img12.png differ diff --git a/volkov_rafael_lab_2/screens/img13.png b/volkov_rafael_lab_2/screens/img13.png new file mode 100644 index 0000000..4e8ac96 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img13.png differ diff --git a/volkov_rafael_lab_2/screens/img14.png b/volkov_rafael_lab_2/screens/img14.png new file mode 100644 index 0000000..af0510f Binary files /dev/null and b/volkov_rafael_lab_2/screens/img14.png differ diff --git a/volkov_rafael_lab_2/screens/img15.png b/volkov_rafael_lab_2/screens/img15.png new file mode 100644 index 0000000..98b2045 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img15.png differ diff --git a/volkov_rafael_lab_2/screens/img2.png b/volkov_rafael_lab_2/screens/img2.png new file mode 100644 index 0000000..e4383e5 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img2.png differ diff --git a/volkov_rafael_lab_2/screens/img3.png b/volkov_rafael_lab_2/screens/img3.png new file mode 100644 index 0000000..6d229d3 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img3.png differ diff --git a/volkov_rafael_lab_2/screens/img4.png b/volkov_rafael_lab_2/screens/img4.png new file mode 100644 index 0000000..92a3601 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img4.png differ diff --git a/volkov_rafael_lab_2/screens/img5.png b/volkov_rafael_lab_2/screens/img5.png new file mode 100644 index 0000000..3d8c798 Binary files /dev/null and b/volkov_rafael_lab_2/screens/img5.png differ diff --git a/volkov_rafael_lab_2/screens/img6.png b/volkov_rafael_lab_2/screens/img6.png new file mode 100644 index 0000000..a7b0dfc Binary files /dev/null and b/volkov_rafael_lab_2/screens/img6.png differ diff --git a/volkov_rafael_lab_2/screens/img7.png b/volkov_rafael_lab_2/screens/img7.png new file mode 100644 index 0000000..482193a Binary files /dev/null and b/volkov_rafael_lab_2/screens/img7.png differ diff --git a/volkov_rafael_lab_2/screens/img8.png b/volkov_rafael_lab_2/screens/img8.png new file mode 100644 index 0000000..10bd44d Binary files /dev/null and b/volkov_rafael_lab_2/screens/img8.png differ diff --git a/volkov_rafael_lab_2/screens/img9.png b/volkov_rafael_lab_2/screens/img9.png new file mode 100644 index 0000000..07c5acd Binary files /dev/null and b/volkov_rafael_lab_2/screens/img9.png differ diff --git a/volkov_rafael_lab_2/worker-1/.gitignore b/volkov_rafael_lab_2/worker-1/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/volkov_rafael_lab_2/worker-1/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/volkov_rafael_lab_2/worker-1/Dockerfile b/volkov_rafael_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..02b10f4 --- /dev/null +++ b/volkov_rafael_lab_2/worker-1/Dockerfile @@ -0,0 +1,18 @@ +# Используем образ с Java +FROM openjdk:21 + +# Создаем директории для данных и результата внутри контейнера +RUN mkdir /var/data +RUN mkdir /var/result + +# Создаем директорию приложения внутри контейнера +WORKDIR /app + +# Копируем исходные файлы вашего Java-приложения внутрь контейнера +COPY src /app/src + +# Компилируем Java-код +RUN javac /app/src/FileCopyMaxLines.java + +# Запускаем Java-приложение +CMD ["java", "-cp", "/app/src", "FileCopyMaxLines"] diff --git a/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java b/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java new file mode 100644 index 0000000..56d98cf --- /dev/null +++ b/volkov_rafael_lab_2/worker-1/src/FileCopyMaxLines.java @@ -0,0 +1,58 @@ +import java.io.*; +import java.nio.file.*; +import java.util.*; + +public class FileCopyMaxLines { + public static void main(String[] args) { + String sourceDir = "/var/data"; + String destinationFile = "/var/result/data.txt"; + + try { + // Создаем файл, если он не существует + File file = new File(destinationFile); + if (!file.exists()) { + if (!file.createNewFile()) { + System.err.println("Ошибка при создании файла."); + return; + } + } + + // Читаем содержимое каталога + File[] files = new File(sourceDir).listFiles(); + if (files != null) { + int maxLines = 0; + String maxLinesFile = null; + + // Ищем файл с наибольшим количеством строк + for (File f : files) { + if (!f.isDirectory()) { + String filePath = f.getAbsolutePath(); + int lines = countLines(filePath); + if (lines > maxLines) { + maxLines = lines; + maxLinesFile = filePath; + } + } + } + + if (maxLinesFile != null) { + // Копируем содержимое файла с наибольшим количеством строк в целевой файл + Path sourcePath = Paths.get(maxLinesFile); + byte[] data = Files.readAllBytes(sourcePath); + Files.write(Paths.get(destinationFile), data, StandardOpenOption.CREATE); + System.out.printf("Файл %s с наибольшим количеством строк (%d) скопирован в %s\n", maxLinesFile, maxLines, destinationFile); + } else { + System.out.println("Не удалось найти файлы в каталоге /var/data."); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + // Метод для подсчета количества строк в файле + private static int countLines(String filePath) throws IOException { + byte[] data = Files.readAllBytes(Paths.get(filePath)); + return new String(data).split("\r\n|\r|\n").length; + } +} diff --git a/volkov_rafael_lab_2/worker-1/worker-1.iml b/volkov_rafael_lab_2/worker-1/worker-1.iml new file mode 100644 index 0000000..d89d290 --- /dev/null +++ b/volkov_rafael_lab_2/worker-1/worker-1.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/volkov_rafael_lab_2/worker-2/.gitignore b/volkov_rafael_lab_2/worker-2/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/volkov_rafael_lab_2/worker-2/.gitignore @@ -0,0 +1,29 @@ +### IntelliJ IDEA ### +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/volkov_rafael_lab_2/worker-2/Dockerfile b/volkov_rafael_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..f19c2d1 --- /dev/null +++ b/volkov_rafael_lab_2/worker-2/Dockerfile @@ -0,0 +1,18 @@ +# Используем образ с Java +FROM openjdk:21 + +# Создаем директории для данных и результата внутри контейнера +RUN mkdir /var/data +RUN mkdir /var/result + +# Создаем директорию приложения внутри контейнера +WORKDIR /app + +# Копируем исходные файлы вашего Java-приложения внутрь контейнера +COPY src /app/src + +# Компилируем Java-код +RUN javac /app/src/MultiplyFirstLast.java + +# Запускаем Java-приложение +CMD ["java", "-cp", "/app/src", "MultiplyFirstLast"] diff --git a/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java b/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java new file mode 100644 index 0000000..1c34a9b --- /dev/null +++ b/volkov_rafael_lab_2/worker-2/src/MultiplyFirstLast.java @@ -0,0 +1,79 @@ +import java.io.*; +import java.util.Scanner; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class MultiplyFirstLast { + public static void main(String[] args) { + String dataFilePath = "/var/result/data.txt"; + String resultFilePath = "/var/result/result.txt"; + + try { + // Создаем файл, если он не существует + File resultFile = new File(resultFilePath); + if (!resultFile.exists()) { + if (!resultFile.createNewFile()) { + System.err.println("Ошибка при создании файла."); + return; + } + } + + // Проверяем существование файла data.txt + File dataFile = new File(dataFilePath); + if (!dataFile.exists()) { + System.err.println("Файл data.txt не существует. Пожалуйста, выполните первую программу перед запуском второй."); + return; + } + + // Читаем содержимое файла data.txt + StringBuilder content = new StringBuilder(); + try (Scanner scanner = new Scanner(dataFile)) { + while (scanner.hasNextLine()) { + content.append(scanner.nextLine()).append("\n"); + } + } + + String[] lines = content.toString().split("\\r?\\n"); + + int first = 0; + int last = 0; + boolean firstFound = false; + boolean numbersFound = false; + + for (String line : lines) { + String[] numbers = line.split("\\s+"); + if (numbers.length > 0) { + // Преобразуем первое и последнее число в числа с плавающей точкой + if (!firstFound) { + first = Integer.parseInt(numbers[0]); + firstFound = true; + } + last = Integer.parseInt(numbers[numbers.length - 1]); + numbersFound = true; + } + } + + if (!numbersFound) { + System.err.printf("Не найдены числа в файле %s%n", dataFilePath); + return; + } + + int result = first * last; + String outputContent = String.valueOf(result); + + // Записываем результат в файл result.txt + try (FileWriter writer = new FileWriter(resultFilePath)) { + writer.write(outputContent); + } + + System.out.printf("Результат (%d) сохранен в файл %s%n", result, resultFilePath); + + // Читаем и выводим результат из файла result.txt + String resultContent = new String(Files.readAllBytes(Paths.get(resultFilePath))); + System.out.println("Результат, лежащий в файле result - " + resultContent); + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/volkov_rafael_lab_2/worker-2/worker-2.iml b/volkov_rafael_lab_2/worker-2/worker-2.iml new file mode 100644 index 0000000..9facd37 --- /dev/null +++ b/volkov_rafael_lab_2/worker-2/worker-2.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file