kamyshov_danila_lab_2 is ready #89
84
kamyshov_danila_lab_2/README.md
Normal file
@ -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
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<div>Общая структура проекта</div>
|
||||||
|
<img src="screens/img1.png" width="650" title="Общая структура проекта">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Работа программы
|
||||||
|
|
||||||
|
- Создание двух директорий: worker-1 и worker-2 для реализаций двух программ.
|
||||||
|
- Описание Dockerfile для создания образов для обоих программ.
|
||||||
|
<p>
|
||||||
|
<div>Worker-1 Dockerfile</div>
|
||||||
|
<img src="screens/img2.png" width="650" title="Worker-1 Dockerfile">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Worker-2 Dockerfile</div>
|
||||||
|
<img src="screens/img3.png" width="650" title="Worker-2 Dockerfile">
|
||||||
|
</p>
|
||||||
|
- Содержимое в файлах в папке data
|
||||||
|
<p>
|
||||||
|
<img src="screens/img4.png" width="50" title="1">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img src="screens/img5.png" width="50" title="2">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img src="screens/img6.png" width="50" title="3">
|
||||||
|
</p>
|
||||||
|
- Описание docker-compose: запускает контейнеры, реализует build для создания образов на основе dockerfile и у второго контейнера описавыется зависимость depends_on от первого контейнера, чтобы сначала запустился первый контейнер, а за ним запустился второй. Также описываются volumes, для монтирование папок data и result в контейнеры.
|
||||||
|
<p>
|
||||||
|
<div>docker-compose</div>
|
||||||
|
<img src="screens/img7.png" width="650" title="docker-compose">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Сборка и запуска контейнеров</div>
|
||||||
|
<img src="screens/img8.png" width="650" title="Сборка и запуска контейнеров">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Проверка в Docker Desktop контейнеров и образов</div>
|
||||||
|
<img src="screens/img9.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img src="screens/img10.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим консоль первого воркера</div>
|
||||||
|
<img src="screens/img11.png" width="650" title="Смотрим, консоль первого воркера">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим консоль второго воркера</div>
|
||||||
|
<img src="screens/img12.png" width="650" title="Смотрим, консоль второго воркера">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим результат работы контейнера, что в папке result создалось два файла data.txt и result.txt</div>
|
||||||
|
<img src="screens/img13.png" width="150" title="Смотрим результат работы контейнера, что в папке result создалось два файла data.txt и result.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим data.txt</div>
|
||||||
|
<img src="screens/img14.png" width="50" title="Смотрим data.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим result.txt</div>
|
||||||
|
<img src="screens/img15.png" width="150" title="Смотрим result.txt">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Видео
|
||||||
|
|
||||||
|
Видео с разбором лабораторной работы - https://drive.google.com/file/d/1LW_U75GK05_xYk9zd8RKpc-K6zeo4ZYJ/view?usp=sharing
|
9
kamyshov_danila_lab_2/data/awdafgergssdf.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
12
|
||||||
|
45
|
||||||
|
78
|
||||||
|
23
|
||||||
|
57
|
||||||
|
80
|
||||||
|
34
|
||||||
|
67
|
||||||
|
90
|
9
kamyshov_danila_lab_2/data/sdfwef.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
45
|
||||||
|
78
|
||||||
|
12
|
||||||
|
98
|
||||||
|
34
|
||||||
|
67
|
||||||
|
23
|
||||||
|
56
|
||||||
|
89
|
9
kamyshov_danila_lab_2/data/sgeagfdsfh.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
98
|
||||||
|
65
|
||||||
|
32
|
||||||
|
87
|
||||||
|
54
|
||||||
|
21
|
||||||
|
76
|
||||||
|
43
|
||||||
|
10
|
17
kamyshov_danila_lab_2/docker-compose.yml
Normal file
@ -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
|
BIN
kamyshov_danila_lab_2/screens/img1.png
Normal file
After Width: | Height: | Size: 67 KiB |
BIN
kamyshov_danila_lab_2/screens/img10.png
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
kamyshov_danila_lab_2/screens/img11.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
kamyshov_danila_lab_2/screens/img12.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
kamyshov_danila_lab_2/screens/img13.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
kamyshov_danila_lab_2/screens/img14.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
kamyshov_danila_lab_2/screens/img15.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
kamyshov_danila_lab_2/screens/img2.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
kamyshov_danila_lab_2/screens/img3.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
kamyshov_danila_lab_2/screens/img4.png
Normal file
After Width: | Height: | Size: 6.9 KiB |
BIN
kamyshov_danila_lab_2/screens/img5.png
Normal file
After Width: | Height: | Size: 7.5 KiB |
BIN
kamyshov_danila_lab_2/screens/img6.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
kamyshov_danila_lab_2/screens/img7.png
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
kamyshov_danila_lab_2/screens/img8.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
kamyshov_danila_lab_2/screens/img9.png
Normal file
After Width: | Height: | Size: 27 KiB |
18
kamyshov_danila_lab_2/worker-1/Dockerfile
Normal file
@ -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"]
|
71
kamyshov_danila_lab_2/worker-1/src/FindShortestFileName.java
Normal file
@ -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<Path> 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<Path> getFilesInDirectory(String directory) throws IOException {
|
||||||
|
try (DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(directory))) {
|
||||||
|
List<Path> fileList = new java.util.ArrayList<>();
|
||||||
|
for (Path entry : stream) {
|
||||||
|
fileList.add(entry);
|
||||||
|
}
|
||||||
|
return fileList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Находит файл с самым коротким именем в списке.
|
||||||
|
*
|
||||||
|
* @param files Список файлов.
|
||||||
|
* @return Путь к файлу с самым коротким именем.
|
||||||
|
*/
|
||||||
|
private static Path findShortestFileName(List<Path> files) {
|
||||||
|
Path shortestFile = files.get(0);
|
||||||
|
for (Path file : files) {
|
||||||
|
if (file.getFileName().toString().length() < shortestFile.getFileName().toString().length()) {
|
||||||
|
shortestFile = file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return shortestFile;
|
||||||
|
}
|
||||||
|
}
|
14
kamyshov_danila_lab_2/worker-1/worker-1.iml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="SonarLintModuleSettings">
|
||||||
|
<option name="uniqueId" value="a8341579-2851-407d-ad6a-b2b7f768ee65" />
|
||||||
|
</component>
|
||||||
|
</module>
|
18
kamyshov_danila_lab_2/worker-2/Dockerfile
Normal file
@ -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"]
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
kamyshov_danila_lab_2/worker-2/worker-2.iml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
<component name="SonarLintModuleSettings">
|
||||||
|
<option name="uniqueId" value="ca0d01ae-0c7f-4c2c-b85f-2442b28d754e" />
|
||||||
|
</component>
|
||||||
|
</module>
|