diff --git a/kochkareva_elizaveta_lab_2/FirstApp.jpg b/kochkareva_elizaveta_lab_2/FirstApp.jpg new file mode 100644 index 0000000..993a36a Binary files /dev/null and b/kochkareva_elizaveta_lab_2/FirstApp.jpg differ diff --git a/kochkareva_elizaveta_lab_2/LaunchingServices.jpg b/kochkareva_elizaveta_lab_2/LaunchingServices.jpg new file mode 100644 index 0000000..dfde9af Binary files /dev/null and b/kochkareva_elizaveta_lab_2/LaunchingServices.jpg differ diff --git a/kochkareva_elizaveta_lab_2/README.md b/kochkareva_elizaveta_lab_2/README.md new file mode 100644 index 0000000..87fcfa9 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/README.md @@ -0,0 +1,194 @@ + +# Лабораторная работа 2. + +### Задание +**Цель**: изучение техники создания простого распределённого приложения. + +**Задачи**: + +- Разработать два приложения такие, что результат первого является исходными данными для второго. +- Изучить файлы сборки образов docker и разработать их для созданных приложений. +- Собрать файл docker-compose.yml для запуска приложений. +- Разобраться с монтированием каталогов из хост-системы. + +**Вариант**: +- Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt. +- Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt. + +### Как запустить лабораторную работу +В директории с файлом характеристик docker-compose.yaml выполнить команду: +``` +docker-compose -f docker-compose.yaml up +``` +### Описание лабораторной работы + +#### Входные данный + +В качестве входных данных представлены следующие файлы с соответствующим содержанием: + +``` +deadlock - file1: 9 5 0 1 +diamond - file2: 3 5 8 +himera - file3: 4 6 6 +kjjuriositi - file4: 3 5 3 +nitric-oxide - file5: 3 1 7 +V3001TH - file6: 7 2 6 +za - file7: 2 4 4 +``` + +#### Первое приложение +Первое приложение выполняет задачу: Ищет в каталоге /var/data файл с самым коротким названием и перекладывает его в /var/result/data.txt. + +Для этого напишем следующий код: + +```java +File dataDir = new File("/var/data"); +File resultDir = new File("/var/result"); +// Получаем все файлы в каталоге /var/data +File[] files = dataDir.listFiles(); +if (files != null && files.length > 0) { + // Ищем файл с самым коротким названием + File shortestFileName = files[0]; + for (File file : files) { + if (file.getName().length() < shortestFileName.getName().length()) { + shortestFileName = file; + } + } + // Перекладываем файл в /var/result/data.txt + File destination = new File(resultDir, "data.txt"); + try { + Files.move(shortestFileName.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Файл успешно перемещен."); + } catch (IOException e) { + System.out.println("Ошибка при перемещении файла: " + e.getMessage()); + } +} else { + System.out.println("В каталоге /var/data нет файлов."); +} +``` + +Также создадим *Dockerfile*, который используется для создания образа контейнера данного приложения. + +```dockerfile +# Используем образ Java для компиляции и запуска кода +FROM openjdk:11 +# Создание директорий для файлов +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /app +# Копируем исходный код в контейнер +COPY src/Main.java . +# Компилируем исходный код +RUN javac Main.java +# Устанавливаем команду запуска приложения +CMD ["java", "Main"] +``` +#### Второе приложение + +Второе приложение выполняет задачу: Сохраняет произведение первого и последнего числа из файла /var/data/data.txt в /var/result/result.txt. + +Для этого напишем следующий код: + +```java +String inputFile = "/var/result/data.txt"; +String outputFile = "/var/result/result.txt"; + +try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); + BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { + + String line; + while ((line = reader.readLine()) != null) { + String[] numbers = line.split("\\s+"); + + if (numbers.length > 0) { + int firstNumber = Integer.parseInt(numbers[0]); + int lastNumber = Integer.parseInt(numbers[numbers.length - 1]); + int result = firstNumber * lastNumber; + + writer.write(String.valueOf(result)); + writer.newLine(); + } + } +} catch (IOException e) { + e.printStackTrace(); +} +``` + +Также создадим *Dockerfile*, который используется для создания образа контейнера данного приложения. + +```dockerfile +# Используем образ Java для компиляции и запуска кода +FROM openjdk:11 +# Создание директорий для файлов +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /app +# Копируем исходный код в контейнер +COPY src/Main.java . +# Компилируем исходный код +RUN javac Main.java +# Устанавливаем команду запуска приложения +CMD ["java", "Main"] +``` + +### Разворачивание сервисов + +Создадим файл docker-compose.yml, который определяет настройки для запуска нескольких сервисов в Docker с использованием Docker Compose. + +Первый блок будет определять первый сервис worker-1. Он будет создан на основе контекста сборки /worker-1 и файла Dockerfile. Затем, указанные тома (volumes) будут примонтированы в контейнере. В данном случае, директория .\data на хосте будет примонтирована в /var/data внутри контейнера, а директория .\result на хосте будет примонтирована в /var/result внутри контейнера. + +```dockerfile + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + volumes: + - .\data:/var/data + - .\result:/var/result +``` + +Второй блок будет определять второй сервис worker-2. Он зависит от сервиса worker-1, поэтому worker-1 будет запущен перед worker-2. Затем, он также будет создан на основе контекста сборки /worker-2 и файла Dockerfile. Аналогично, указанные тома будут примонтированы в контейнере. + +```dockerfile + worker-2: + depends_on: + - worker-1 + build: + context: /worker-2 + dockerfile: Dockerfile + volumes: + - .\result:/var/data + - .\result:/var/result +``` + +### Запуск + +![Сборка docker-compose](LaunchingServices.jpg) + +![Первое приложение](FirstApp.jpg) + +![Второе приложение](SecondApp.jpg) + +Файлы директории data: + +``` +deadlock - file1: 9 5 0 1 +diamond - file2: 3 5 8 +himera - file3: 4 6 6 +kjjuriositi - file4: 3 5 3 +nitric-oxide - file5: 3 1 7 +V3001TH - file6: 7 2 6 +za - file7: 2 4 4 +``` + +Файлы директории result: + +``` +data: 2 4 4 +result: 8 +``` +### Видео + +https://disk.yandex.ru/i/dFIB-vOqlAip9g \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/SecondApp.jpg b/kochkareva_elizaveta_lab_2/SecondApp.jpg new file mode 100644 index 0000000..7cecf8e Binary files /dev/null and b/kochkareva_elizaveta_lab_2/SecondApp.jpg differ diff --git a/kochkareva_elizaveta_lab_2/data/V3001TH - file6.txt b/kochkareva_elizaveta_lab_2/data/V3001TH - file6.txt new file mode 100644 index 0000000..aa86ee9 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/data/V3001TH - file6.txt @@ -0,0 +1 @@ +7 2 6 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/data/deadlock - file1.txt b/kochkareva_elizaveta_lab_2/data/deadlock - file1.txt new file mode 100644 index 0000000..daf676e --- /dev/null +++ b/kochkareva_elizaveta_lab_2/data/deadlock - file1.txt @@ -0,0 +1 @@ +9 5 0 1 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/data/diamond - file2.txt b/kochkareva_elizaveta_lab_2/data/diamond - file2.txt new file mode 100644 index 0000000..b4c41e1 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/data/diamond - file2.txt @@ -0,0 +1 @@ +3 5 8 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/data/kjjuriositi - file4.txt b/kochkareva_elizaveta_lab_2/data/kjjuriositi - file4.txt new file mode 100644 index 0000000..d191d2d --- /dev/null +++ b/kochkareva_elizaveta_lab_2/data/kjjuriositi - file4.txt @@ -0,0 +1 @@ +3 5 3 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/data/nitric-oxide - file5.txt b/kochkareva_elizaveta_lab_2/data/nitric-oxide - file5.txt new file mode 100644 index 0000000..6f7fe59 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/data/nitric-oxide - file5.txt @@ -0,0 +1 @@ +3 1 7 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/docker-compose.yaml b/kochkareva_elizaveta_lab_2/docker-compose.yaml new file mode 100644 index 0000000..64011e3 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/docker-compose.yaml @@ -0,0 +1,19 @@ +version: '3' +services: + worker-1: + build: + context: /worker-1 + dockerfile: Dockerfile + volumes: + - .\data:/var/data + - .\result:/var/result + + worker-2: + depends_on: + - worker-1 + build: + context: /worker-2 + dockerfile: Dockerfile + volumes: + - .\result:/var/data + - .\result:/var/result \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/result/data.txt b/kochkareva_elizaveta_lab_2/result/data.txt new file mode 100644 index 0000000..4f869c2 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/result/data.txt @@ -0,0 +1 @@ +4 6 6 \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/result/result.txt b/kochkareva_elizaveta_lab_2/result/result.txt new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/result/result.txt @@ -0,0 +1 @@ +24 diff --git a/kochkareva_elizaveta_lab_2/worker-1/.gitignore b/kochkareva_elizaveta_lab_2/worker-1/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/kochkareva_elizaveta_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/kochkareva_elizaveta_lab_2/worker-1/Dockerfile b/kochkareva_elizaveta_lab_2/worker-1/Dockerfile new file mode 100644 index 0000000..d5973ee --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-1/Dockerfile @@ -0,0 +1,13 @@ +# Используем образ Java для компиляции и запуска кода +FROM openjdk:11 +# Создание директорий для файлов +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /app +# Копируем исходный код в контейнер +COPY src/Main.java . +# Компилируем исходный код +RUN javac Main.java +# Устанавливаем команду запуска приложения +CMD ["java", "Main"] \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/worker-1/src/Main.java b/kochkareva_elizaveta_lab_2/worker-1/src/Main.java new file mode 100644 index 0000000..a5526cf --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-1/src/Main.java @@ -0,0 +1,32 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +public class Main { + public static void main(String[] args) { + File dataDir = new File("/var/data"); + File resultDir = new File("/var/result"); + // Получаем все файлы в каталоге + File[] files = dataDir.listFiles(); + if (files != null && files.length > 0) { + // Ищем файл с самым коротким названием + File shortestFileName = files[0]; + for (File file : files) { + if (file.getName().length() < shortestFileName.getName().length()) { + shortestFileName = file; + } + } + // Перекладываем файл + File destination = new File(resultDir, "data.txt"); + try { + Files.move(shortestFileName.toPath(), destination.toPath(), StandardCopyOption.REPLACE_EXISTING); + System.out.println("Приложение 1: Файл успешно перемещен."); + } catch (IOException e) { + System.out.println("Приложение 1: Ошибка при перемещении файла: " + e.getMessage()); + } + } else { + System.out.println("Приложение 1: В каталоге /var/data нет файлов."); + } + } +} \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/worker-1/worker-1.iml b/kochkareva_elizaveta_lab_2/worker-1/worker-1.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-1/worker-1.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/worker-2/.gitignore b/kochkareva_elizaveta_lab_2/worker-2/.gitignore new file mode 100644 index 0000000..f68d109 --- /dev/null +++ b/kochkareva_elizaveta_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/kochkareva_elizaveta_lab_2/worker-2/Dockerfile b/kochkareva_elizaveta_lab_2/worker-2/Dockerfile new file mode 100644 index 0000000..d5973ee --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-2/Dockerfile @@ -0,0 +1,13 @@ +# Используем образ Java для компиляции и запуска кода +FROM openjdk:11 +# Создание директорий для файлов +RUN ["mkdir", "/var/data"] +RUN ["mkdir", "/var/result"] +# Устанавливаем рабочую директорию внутри контейнера +WORKDIR /app +# Копируем исходный код в контейнер +COPY src/Main.java . +# Компилируем исходный код +RUN javac Main.java +# Устанавливаем команду запуска приложения +CMD ["java", "Main"] \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/worker-2/src/Main.java b/kochkareva_elizaveta_lab_2/worker-2/src/Main.java new file mode 100644 index 0000000..be21298 --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-2/src/Main.java @@ -0,0 +1,32 @@ +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +public class Main { + public static void main(String[] args) { + String inputFile = "/var/result/data.txt"; + String outputFile = "/var/result/result.txt"; + + try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); + BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { + + String line; + while ((line = reader.readLine()) != null) { + String[] numbers = line.split("\\s+"); + + if (numbers.length > 0) { + int firstNumber = Integer.parseInt(numbers[0]); + int lastNumber = Integer.parseInt(numbers[numbers.length - 1]); + int result = firstNumber * lastNumber; + System.out.println("Приложение 2: Результат умножения первого и последнего числа: " + result); + writer.write(String.valueOf(result)); + writer.newLine(); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/kochkareva_elizaveta_lab_2/worker-2/worker-2.iml b/kochkareva_elizaveta_lab_2/worker-2/worker-2.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/kochkareva_elizaveta_lab_2/worker-2/worker-2.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file