diff --git a/kutygin_andrey_lab_1/.idea/workspace.xml b/kutygin_andrey_lab_1/.idea/workspace.xml new file mode 100644 index 0000000..ea6c570 --- /dev/null +++ b/kutygin_andrey_lab_1/.idea/workspace.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1704436409086 + + + + \ No newline at end of file diff --git a/kutygin_andrey_lab_2/.idea/.gitignore b/kutygin_andrey_lab_2/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/kutygin_andrey_lab_2/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/kutygin_andrey_lab_2/.idea/jpa-buddy.xml b/kutygin_andrey_lab_2/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/kutygin_andrey_lab_2/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/kutygin_andrey_lab_2/.idea/misc.xml b/kutygin_andrey_lab_2/.idea/misc.xml new file mode 100644 index 0000000..cac8158 --- /dev/null +++ b/kutygin_andrey_lab_2/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/kutygin_andrey_lab_2/.idea/modules.xml b/kutygin_andrey_lab_2/.idea/modules.xml new file mode 100644 index 0000000..73acb93 --- /dev/null +++ b/kutygin_andrey_lab_2/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/kutygin_andrey_lab_2/README.md b/kutygin_andrey_lab_2/README.md new file mode 100644 index 0000000..50511aa --- /dev/null +++ b/kutygin_andrey_lab_2/README.md @@ -0,0 +1,121 @@ +**Задание** +*** +Цель: изучение техники создания простого распределённого приложения. + +**Задачи** +*** + +Согласно варианту (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 проверяются числа из каждого файла и выбирается самое большое + +**Firsttxt.txt:** +1 +2 +3 +4 +5 + +**Secondtxt.txt** +1 +2 +3 + +**Thirdtxt.txt** +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 + +В /var/result/result.txt записывается число 100 - квадрат наибольшего числа - 10 + +**Dockerfile** + +Для данной работы были созданы идентичные докер-файлы в обоих проектах. +```` +FROM openjdk:17 + +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 - выбор базового образа + +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 #том для папки результатов +```` + +Видео: https://disk.yandex.ru/d/jpeOKQ_PAO0c0Q diff --git a/kutygin_andrey_lab_2/docker-compose.yml b/kutygin_andrey_lab_2/docker-compose.yml new file mode 100644 index 0000000..2fd2818 --- /dev/null +++ b/kutygin_andrey_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/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml b/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/kutygin_andrey_lab_2/kutygin_andrey_lab_2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/kutygin_andrey_lab_2/var/data/Firsttxt.txt b/kutygin_andrey_lab_2/var/data/Firsttxt.txt new file mode 100644 index 0000000..85954ea --- /dev/null +++ b/kutygin_andrey_lab_2/var/data/Firsttxt.txt @@ -0,0 +1,5 @@ +1 +2 +3 +4 +5 \ No newline at end of file diff --git a/kutygin_andrey_lab_2/var/data/Secondtxt.txt b/kutygin_andrey_lab_2/var/data/Secondtxt.txt new file mode 100644 index 0000000..01e79c3 --- /dev/null +++ b/kutygin_andrey_lab_2/var/data/Secondtxt.txt @@ -0,0 +1,3 @@ +1 +2 +3 diff --git a/kutygin_andrey_lab_2/var/data/Thirdtxt.txt b/kutygin_andrey_lab_2/var/data/Thirdtxt.txt new file mode 100644 index 0000000..0b669b6 --- /dev/null +++ b/kutygin_andrey_lab_2/var/data/Thirdtxt.txt @@ -0,0 +1,10 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 \ No newline at end of file diff --git a/kutygin_andrey_lab_2/var/result/data.txt b/kutygin_andrey_lab_2/var/result/data.txt new file mode 100644 index 0000000..0b669b6 --- /dev/null +++ b/kutygin_andrey_lab_2/var/result/data.txt @@ -0,0 +1,10 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 \ No newline at end of file diff --git a/kutygin_andrey_lab_2/var/result/result.txt b/kutygin_andrey_lab_2/var/result/result.txt new file mode 100644 index 0000000..e772e62 --- /dev/null +++ b/kutygin_andrey_lab_2/var/result/result.txt @@ -0,0 +1 @@ +100.0 \ No newline at end of file diff --git a/kutygin_andrey_lab_2/worker_1/Dockerfile b/kutygin_andrey_lab_2/worker_1/Dockerfile new file mode 100644 index 0000000..499807d --- /dev/null +++ b/kutygin_andrey_lab_2/worker_1/Dockerfile @@ -0,0 +1,11 @@ +FROM openjdk:17 + +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/kutygin_andrey_lab_2/worker_1/src/Main.java b/kutygin_andrey_lab_2/worker_1/src/Main.java new file mode 100644 index 0000000..2341fd7 --- /dev/null +++ b/kutygin_andrey_lab_2/worker_1/src/Main.java @@ -0,0 +1,40 @@ +import java.io.*; +import java.nio.file.*; + +//Ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. +public class Main { + private static Path findLargestFile(DirectoryStream stream) throws IOException { + long maxSize = 0; + Path largestFile = null; + + for (Path file : stream) { + long size = Files.size(file); + if (size > maxSize) { + maxSize = size; + largestFile = file; + } + } + + return largestFile; + } + + public static void main(String[] args) { + Path dataDir = Path.of("/var/data"); + Path resultDir = Path.of("/var/result"); + + try (DirectoryStream stream = Files.newDirectoryStream(dataDir)) { + Path largestFile = findLargestFile(stream); + + if (largestFile != null) { + Files.createFile(resultDir.resolve("data.txt")); + Files.copy(largestFile, resultDir.resolve("data.txt"), StandardCopyOption.REPLACE_EXISTING); + System.out.println(largestFile.getFileName() + " перемещён"); + } else { + System.out.println("Файл не найден"); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/kutygin_andrey_lab_2/worker_2/Dockerfile b/kutygin_andrey_lab_2/worker_2/Dockerfile new file mode 100644 index 0000000..499807d --- /dev/null +++ b/kutygin_andrey_lab_2/worker_2/Dockerfile @@ -0,0 +1,11 @@ +FROM openjdk:17 + +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/kutygin_andrey_lab_2/worker_2/src/Main.java b/kutygin_andrey_lab_2/worker_2/src/Main.java new file mode 100644 index 0000000..9b7f2df --- /dev/null +++ b/kutygin_andrey_lab_2/worker_2/src/Main.java @@ -0,0 +1,50 @@ +import java.io.*; +import java.nio.file.*; +import java.util.*; + +//Ищет набольшее число из файла /var/data/data.txt и сохраняет его вторую степень в /var/result/result.txt. +public class Main { + public static void main(String[] args) { + Path dataFile = Path.of("/var/result/data.txt"); + Path resultFile = Path.of("/var/result/result.txt"); + + try { + if (!Files.exists(dataFile)) { + System.out.println("Файл data.txt не существует"); + return; + } + + List numbers = readNumbersFromFile(dataFile); + int maxNumber = findMaxNumber(numbers); + + try (BufferedWriter writer = Files.newBufferedWriter(resultFile)) { + writer.write(String.valueOf(Math.pow(maxNumber,2))); + } + + System.out.println("квадрат наибольшего числа " + Math.pow(maxNumber,2)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static List readNumbersFromFile(Path dataFile) throws IOException { + List numbers = new ArrayList<>(); + try (BufferedReader reader = Files.newBufferedReader(dataFile)) { + String line; + while ((line = reader.readLine()) != null) { + numbers.add(Integer.parseInt(line)); + } + } + return numbers; + } + + private static int findMaxNumber(List numbers) { + int maxNumber = Integer.MIN_VALUE; + for (int number : numbers) { + if (number > maxNumber) { + maxNumber = number; + } + } + return maxNumber; + } +} \ No newline at end of file