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

+

Общая структура проекта
+ +

+ +# Работа программы + +- Создание двух директорий: 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/1LW_U75GK05_xYk9zd8RKpc-K6zeo4ZYJ/view?usp=sharing diff --git a/kamyshov_danila_lab_2/data/awdafgergssdf.txt b/kamyshov_danila_lab_2/data/awdafgergssdf.txt new file mode 100644 index 0000000..b744bf3 --- /dev/null +++ b/kamyshov_danila_lab_2/data/awdafgergssdf.txt @@ -0,0 +1,9 @@ +12 +45 +78 +23 +57 +80 +34 +67 +90 diff --git a/kamyshov_danila_lab_2/data/sdfwef.txt b/kamyshov_danila_lab_2/data/sdfwef.txt new file mode 100644 index 0000000..1a683fd --- /dev/null +++ b/kamyshov_danila_lab_2/data/sdfwef.txt @@ -0,0 +1,9 @@ +45 +78 +12 +98 +34 +67 +23 +56 +89 diff --git a/kamyshov_danila_lab_2/data/sgeagfdsfh.txt b/kamyshov_danila_lab_2/data/sgeagfdsfh.txt new file mode 100644 index 0000000..8f7ffeb --- /dev/null +++ b/kamyshov_danila_lab_2/data/sgeagfdsfh.txt @@ -0,0 +1,9 @@ +98 +65 +32 +87 +54 +21 +76 +43 +10 diff --git a/kamyshov_danila_lab_2/docker-compose.yml b/kamyshov_danila_lab_2/docker-compose.yml new file mode 100644 index 0000000..1283698 --- /dev/null +++ b/kamyshov_danila_lab_2/docker-compose.yml @@ -0,0 +1,17 @@ +services: + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + volumes: + - D:\RVIP\kamyshov_danila_lab_2\data:/var/data + - D:\RVIP\kamyshov_danila_lab_2\result:/var/result + worker-2: + build: + context: /worker-2 + dockerfile: Dockerfile + volumes: + - D:\RVIP\kamyshov_danila_lab_2\data:/var/data + - D:\RVIP\kamyshov_danila_lab_2\result:/var/result + depends_on: + - worker-1 \ No newline at end of file diff --git a/kamyshov_danila_lab_2/screens/img1.png b/kamyshov_danila_lab_2/screens/img1.png new file mode 100644 index 0000000..3fa8d45 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img1.png differ diff --git a/kamyshov_danila_lab_2/screens/img10.png b/kamyshov_danila_lab_2/screens/img10.png new file mode 100644 index 0000000..02ae3ec Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img10.png differ diff --git a/kamyshov_danila_lab_2/screens/img11.png b/kamyshov_danila_lab_2/screens/img11.png new file mode 100644 index 0000000..83577ec Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img11.png differ diff --git a/kamyshov_danila_lab_2/screens/img12.png b/kamyshov_danila_lab_2/screens/img12.png new file mode 100644 index 0000000..89d615d Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img12.png differ diff --git a/kamyshov_danila_lab_2/screens/img13.png b/kamyshov_danila_lab_2/screens/img13.png new file mode 100644 index 0000000..38dd263 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img13.png differ diff --git a/kamyshov_danila_lab_2/screens/img14.png b/kamyshov_danila_lab_2/screens/img14.png new file mode 100644 index 0000000..c241c45 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img14.png differ diff --git a/kamyshov_danila_lab_2/screens/img15.png b/kamyshov_danila_lab_2/screens/img15.png new file mode 100644 index 0000000..a18431b Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img15.png differ diff --git a/kamyshov_danila_lab_2/screens/img2.png b/kamyshov_danila_lab_2/screens/img2.png new file mode 100644 index 0000000..126af72 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img2.png differ diff --git a/kamyshov_danila_lab_2/screens/img3.png b/kamyshov_danila_lab_2/screens/img3.png new file mode 100644 index 0000000..31594e2 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img3.png differ diff --git a/kamyshov_danila_lab_2/screens/img4.png b/kamyshov_danila_lab_2/screens/img4.png new file mode 100644 index 0000000..3f744ac Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img4.png differ diff --git a/kamyshov_danila_lab_2/screens/img5.png b/kamyshov_danila_lab_2/screens/img5.png new file mode 100644 index 0000000..ff2dfdd Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img5.png differ diff --git a/kamyshov_danila_lab_2/screens/img6.png b/kamyshov_danila_lab_2/screens/img6.png new file mode 100644 index 0000000..82ea31e Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img6.png differ diff --git a/kamyshov_danila_lab_2/screens/img7.png b/kamyshov_danila_lab_2/screens/img7.png new file mode 100644 index 0000000..7b0f738 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img7.png differ diff --git a/kamyshov_danila_lab_2/screens/img8.png b/kamyshov_danila_lab_2/screens/img8.png new file mode 100644 index 0000000..f40bcc7 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img8.png differ diff --git a/kamyshov_danila_lab_2/screens/img9.png b/kamyshov_danila_lab_2/screens/img9.png new file mode 100644 index 0000000..de15232 Binary files /dev/null and b/kamyshov_danila_lab_2/screens/img9.png differ diff --git a/kamyshov_danila_lab_2/worker-1/Dockerfile b/kamyshov_danila_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..06c62f8 --- /dev/null +++ b/kamyshov_danila_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/FindShortestFileName.java + +# Запускаем Java-приложение +CMD ["java", "-cp", "/app/src", "FindShortestFileName"] diff --git a/kamyshov_danila_lab_2/worker-1/src/FindShortestFileName.java b/kamyshov_danila_lab_2/worker-1/src/FindShortestFileName.java new file mode 100644 index 0000000..7d57364 --- /dev/null +++ b/kamyshov_danila_lab_2/worker-1/src/FindShortestFileName.java @@ -0,0 +1,71 @@ +import java.io.IOException; +import java.nio.file.*; +import java.util.List; + +/** + * Программа для перемещения файла с самым коротким именем из одной директории в другую. + */ +public class FindShortestFileName { + + /** + * Точка входа в программу. + */ + public static void main(String[] args) { + // Указываем пути исходной и целевой директорий, а также путь результирующего файла + String sourceDirectory = "/var/data"; + String destinationDirectory = "/var/result"; + String resultFile = destinationDirectory + "/data.txt"; + + try { + // Получаем список файлов в исходной директории + List files = getFilesInDirectory(sourceDirectory); + + if (!files.isEmpty()) { + // Находим файл с самым коротким именем + Path shortestFileName = findShortestFileName(files); + + // Копируем найденный файл в целевую директорию + Files.copy(shortestFileName, Paths.get(resultFile), StandardCopyOption.REPLACE_EXISTING); + + System.out.println("Файл " + shortestFileName.getFileName() + " был скопирован в " + resultFile); + } else { + System.out.println("В исходной директории нет файлов для копирования."); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * Получает список файлов в указанной директории. + * + * @param directory Путь к директории. + * @return Список файлов в директории. + * @throws IOException В случае ошибок при чтении директории. + */ + private static List getFilesInDirectory(String directory) throws IOException { + try (DirectoryStream stream = Files.newDirectoryStream(Paths.get(directory))) { + List fileList = new java.util.ArrayList<>(); + for (Path entry : stream) { + fileList.add(entry); + } + return fileList; + } + } + + /** + * Находит файл с самым коротким именем в списке. + * + * @param files Список файлов. + * @return Путь к файлу с самым коротким именем. + */ + private static Path findShortestFileName(List files) { + Path shortestFile = files.get(0); + for (Path file : files) { + if (file.getFileName().toString().length() < shortestFile.getFileName().toString().length()) { + shortestFile = file; + } + } + return shortestFile; + } +} diff --git a/kamyshov_danila_lab_2/worker-1/worker-1.iml b/kamyshov_danila_lab_2/worker-1/worker-1.iml new file mode 100644 index 0000000..d89d290 --- /dev/null +++ b/kamyshov_danila_lab_2/worker-1/worker-1.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/kamyshov_danila_lab_2/worker-2/Dockerfile b/kamyshov_danila_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..8fca161 --- /dev/null +++ b/kamyshov_danila_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/FindingLargestNumberFile.java + +# Запускаем Java-приложение +CMD ["java", "-cp", "/app/src", "FindingLargestNumberFile"] diff --git a/kamyshov_danila_lab_2/worker-2/src/FindingLargestNumberFile.java b/kamyshov_danila_lab_2/worker-2/src/FindingLargestNumberFile.java new file mode 100644 index 0000000..e1007c6 --- /dev/null +++ b/kamyshov_danila_lab_2/worker-2/src/FindingLargestNumberFile.java @@ -0,0 +1,56 @@ +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +/** + * Программа для поиска наибольшего числа в файле, вычисления его второй степени и сохранения результата в другом файле. + */ +public class FindingLargestNumberFile { + + /** + * Точка входа в программу. + */ + public static void main(String[] args) { + // Указываем пути к исходному и результативному файлам + String sourceFilePath = "/var/result/data.txt"; + String resultFilePath = "/var/result/result.txt"; + + try (BufferedReader reader = new BufferedReader(new FileReader(sourceFilePath))) { + String line; + double largestNumber = Double.MIN_VALUE; + + // Читаем файл построчно и находим наибольшее число + while ((line = reader.readLine()) != null) { + try { + double number = Double.parseDouble(line); + if (number > largestNumber) { + largestNumber = number; + } + } catch (NumberFormatException e) { + // Пропускаем строки, которые не могут быть преобразованы в числа + } + } + + if (largestNumber != Double.MIN_VALUE) { + // Вычисляем вторую степень наибольшего числа + double square = Math.pow(largestNumber, 2); + + // Записываем результат в новый файл + try (FileWriter writer = new FileWriter(resultFilePath)) { + writer.write(Double.toString(square)); + } + + // Выводим результаты на экран + System.out.println("Наибольшее число в файле: " + largestNumber); + System.out.println("Вторая степень наибольшего числа: " + square); + System.out.println("Результат сохранен в " + resultFilePath); + } else { + System.out.println("Файл не содержит чисел."); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/kamyshov_danila_lab_2/worker-2/worker-2.iml b/kamyshov_danila_lab_2/worker-2/worker-2.iml new file mode 100644 index 0000000..9facd37 --- /dev/null +++ b/kamyshov_danila_lab_2/worker-2/worker-2.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file