diff --git a/martysheva_tamara_lab_2/README.md b/martysheva_tamara_lab_2/README.md new file mode 100644 index 0000000..06234e4 --- /dev/null +++ b/martysheva_tamara_lab_2/README.md @@ -0,0 +1,69 @@ +# Лабораторная работа №2 - Разработка простейшего распределённого приложения +**Цель**: изучение техники создания простого распределённого приложения. + +**Задачи**: +* Согласно варианту (0 и 1) разработать два приложения такие, что результат первого является исходными данными для второго. +* Изучить файлы сборки образов docker и разработать их для созданных приложений. +* Собрать файл docker-compose.yml для запуска приложений. Разобраться с монтированием каталогов из хост-системы. +* Правильно закоммитить результат без лишних файлов. +* Оформить pull request по правилам и отправить его на проверку. +*** +## *Ход работы:* +### Разворачивание сервисов: +Были разработаны два приложения на ЯП java: +* worker1 - ищет в каталоге /var/data самый большой по объёму файл и перекладывает его в /var/result/data.txt. +* worker2 - ищет набольшее число из файла /var/result/data.txt и сохраняет его вторую степень в /var/result/result.txt. +### Исходные файлы +Исходные файлы содержать различные числа и отсортированы по размеру. + +В /var/result/data.txt должны скопироваться числа из наибольшего файла - 3.txt + +В /var/result/result.txt должно записаться число 15 625 - квадрат максимального числа (125) + +![](images/files.jpg "") +### 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"] #запуск java-приложения +``` +### docker-compose.yml +Был создан файл docker-compose.yml для разворачивания сервисов: +``` +version: "3" #формат конфигурации Docker Compose версии 3 +services: #определение сервисов + worker1: + build: + context: /worker1 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\data:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов + worker2: + depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск + - worker1 + build: + context: /worker2 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\result:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов +``` +### docker-compose up -d +Создание контейнеров: + +![](images/downloading.jpg "") +*** +## *Результат:* +![](images/result-dockerhub.jpg "") + +![](images/result-files.jpg "") diff --git a/martysheva_tamara_lab_2/docker-compose.yml b/martysheva_tamara_lab_2/docker-compose.yml new file mode 100644 index 0000000..6f8681f --- /dev/null +++ b/martysheva_tamara_lab_2/docker-compose.yml @@ -0,0 +1,18 @@ +version: "3" #формат конфигурации Docker Compose версии 3 +services: #определение сервисов + worker1: + build: + context: /worker1 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\data:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов + worker2: + depends_on: #зависимость: worker2 не будет запущен, пока worker1 не завершит свой запуск + - worker1 + build: + context: /worker2 #путь к контексту сборки + dockerfile: Dockerfile #имя докерфайла + volumes: + - .\var\result:/var/data #том для папки файлов + - .\var\result:/var/result #том для папки результатов \ No newline at end of file diff --git a/martysheva_tamara_lab_2/images/downloading.jpg b/martysheva_tamara_lab_2/images/downloading.jpg new file mode 100644 index 0000000..30866ac Binary files /dev/null and b/martysheva_tamara_lab_2/images/downloading.jpg differ diff --git a/martysheva_tamara_lab_2/images/files.jpg b/martysheva_tamara_lab_2/images/files.jpg new file mode 100644 index 0000000..e910430 Binary files /dev/null and b/martysheva_tamara_lab_2/images/files.jpg differ diff --git a/martysheva_tamara_lab_2/images/result-dockerhub.jpg b/martysheva_tamara_lab_2/images/result-dockerhub.jpg new file mode 100644 index 0000000..611d438 Binary files /dev/null and b/martysheva_tamara_lab_2/images/result-dockerhub.jpg differ diff --git a/martysheva_tamara_lab_2/images/result-files.jpg b/martysheva_tamara_lab_2/images/result-files.jpg new file mode 100644 index 0000000..6ee63c3 Binary files /dev/null and b/martysheva_tamara_lab_2/images/result-files.jpg differ diff --git a/martysheva_tamara_lab_2/var/data/1.txt b/martysheva_tamara_lab_2/var/data/1.txt new file mode 100644 index 0000000..bf0d87a --- /dev/null +++ b/martysheva_tamara_lab_2/var/data/1.txt @@ -0,0 +1 @@ +4 \ No newline at end of file diff --git a/martysheva_tamara_lab_2/var/data/2.txt b/martysheva_tamara_lab_2/var/data/2.txt new file mode 100644 index 0000000..0515ce7 --- /dev/null +++ b/martysheva_tamara_lab_2/var/data/2.txt @@ -0,0 +1,5 @@ +23 +4 +123 +46 +15 \ No newline at end of file diff --git a/martysheva_tamara_lab_2/var/data/3.txt b/martysheva_tamara_lab_2/var/data/3.txt new file mode 100644 index 0000000..e9a3172 --- /dev/null +++ b/martysheva_tamara_lab_2/var/data/3.txt @@ -0,0 +1,15 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +100 +121 +125 +1 +2 +3 diff --git a/martysheva_tamara_lab_2/var/result/data.txt b/martysheva_tamara_lab_2/var/result/data.txt new file mode 100644 index 0000000..e9a3172 --- /dev/null +++ b/martysheva_tamara_lab_2/var/result/data.txt @@ -0,0 +1,15 @@ +1 +2 +3 +4 +5 +6 +7 +8 +9 +100 +121 +125 +1 +2 +3 diff --git a/martysheva_tamara_lab_2/var/result/result.txt b/martysheva_tamara_lab_2/var/result/result.txt new file mode 100644 index 0000000..c153c91 --- /dev/null +++ b/martysheva_tamara_lab_2/var/result/result.txt @@ -0,0 +1 @@ +15625.0 \ No newline at end of file diff --git a/martysheva_tamara_lab_2/video.mkv b/martysheva_tamara_lab_2/video.mkv new file mode 100644 index 0000000..975f07b Binary files /dev/null and b/martysheva_tamara_lab_2/video.mkv differ diff --git a/martysheva_tamara_lab_2/worker1/Dockerfile b/martysheva_tamara_lab_2/worker1/Dockerfile new file mode 100644 index 0000000..a88c528 --- /dev/null +++ b/martysheva_tamara_lab_2/worker1/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"] #запуск java-приложения \ No newline at end of file diff --git a/martysheva_tamara_lab_2/worker1/src/Main.java b/martysheva_tamara_lab_2/worker1/src/Main.java new file mode 100644 index 0000000..0f2b3a9 --- /dev/null +++ b/martysheva_tamara_lab_2/worker1/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(); + } + } +} diff --git a/martysheva_tamara_lab_2/worker2/Dockerfile b/martysheva_tamara_lab_2/worker2/Dockerfile new file mode 100644 index 0000000..a88c528 --- /dev/null +++ b/martysheva_tamara_lab_2/worker2/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"] #запуск java-приложения \ No newline at end of file diff --git a/martysheva_tamara_lab_2/worker2/src/Main.java b/martysheva_tamara_lab_2/worker2/src/Main.java new file mode 100644 index 0000000..82c8cf2 --- /dev/null +++ b/martysheva_tamara_lab_2/worker2/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; + } +}