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