savenkov_alexander_lab_2 is ready
105
savenkov_alexander_lab_2/README.md
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# Лабораторная работа №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
|
||||||
|
|
||||||
|
Приложения выполнены на языке Java
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<div>Worker-1</div>
|
||||||
|
<img src="screens/img1.png" width="650" title="Worker-1">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Worker-2</div>
|
||||||
|
<img src="screens/img2.png" width="650" title="Worker-2">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Запуск
|
||||||
|
|
||||||
|
Запуск контейнеров производится командой "docker-compose up -d"
|
||||||
|
|
||||||
|
# Работа программы
|
||||||
|
|
||||||
|
- Создание двух деррикторий: worker-1 и worker-2 для реализаций двух программ.
|
||||||
|
- Описание Dockerfile для создания образов для обоих программ.
|
||||||
|
<p>
|
||||||
|
<div>Worker-1 Dockerfile</div>
|
||||||
|
<img src="screens/img3.png" width="650" title="Worker-1 Dockerfile">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Worker-2 Dockerfile</div>
|
||||||
|
<img src="screens/img4.png" width="650" title="Worker-2 Dockerfile">
|
||||||
|
</p>
|
||||||
|
- Создание двух репозиториев: data, result, для монтирования их в контейнеры.
|
||||||
|
<p>
|
||||||
|
<div>data</div>
|
||||||
|
<img src="screens/img5.png" width="650" title="data">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>result</div>
|
||||||
|
<img src="screens/img6.png" width="650" title="result">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>f3.txt</div>
|
||||||
|
<img src="screens/img7.png" width="650" title="f3.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>file_with_a_very_long_name_that_is_often_used_in_programming.txt</div>
|
||||||
|
<img src="screens/img8.png" width="650" title="file_with_a_very_long_name_that_is_often_used_in_programming.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>file1.txt</div>
|
||||||
|
<img src="screens/img9.png" width="650" title="file1.txt">
|
||||||
|
</p>
|
||||||
|
- Описание docker-compose: запускает контейнеры, реализует build для создания образов на основе dockerfile и у второго контейнера описавыется зависимость depends_on от первого контейнера, чтобы сначала запустился первый контейнер, а за ним запустился второй. Также описываются volumes, для монтирование папок data и result в контейнеры.
|
||||||
|
<p>
|
||||||
|
<div>docker-compose</div>
|
||||||
|
<img src="screens/img10.png" width="650" title="docker-compose">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Сборка и запуска контейнеров</div>
|
||||||
|
<img src="screens/img11.png" width="650" title="Сборка и запуска контейнеров">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Проверка в Docker Desktop контейнеров и образов</div>
|
||||||
|
<img src="screens/img12.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<img src="screens/img13.png" width="650" title="Проверка в Docker Desktop контейнеров и образов">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим, что выдает нам первый воркер в консоль</div>
|
||||||
|
<img src="screens/img14.png" width="650" title="Смотрим, что выдает нам первый воркер в консоль">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим, что выдает нам второй воркер в консоль</div>
|
||||||
|
<img src="screens/img15.png" width="650" title="Смотрим, что выдает нам второй воркер в консоль">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим, что при запуске контейнеров действительно в папке result создалось два файла data.txt и result.txt</div>
|
||||||
|
<img src="screens/img16.png" width="650" title="Смотрим, что при запуске контейнеров действительно в папке result создалось два файла data.txt и result.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим, что лежит в файле data.txt</div>
|
||||||
|
<img src="screens/img17.png" width="650" title="Смотрим, что лежит в файле data.txt">
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<div>Смотрим, что лежит в файле result.txt</div>
|
||||||
|
<img src="screens/img18.png" width="650" title="Смотрим, что лежит в файле result.txt">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Видео
|
||||||
|
|
||||||
|
Видео с разбором лабораторной работы - https://youtu.be/o_sTok7W22s
|
9
savenkov_alexander_lab_2/data/f3.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
987
|
||||||
|
654
|
||||||
|
321
|
||||||
|
876
|
||||||
|
543
|
||||||
|
210
|
||||||
|
765
|
||||||
|
432
|
||||||
|
100
|
9
savenkov_alexander_lab_2/data/file1.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
456
|
||||||
|
789
|
||||||
|
123
|
||||||
|
987
|
||||||
|
345
|
||||||
|
678
|
||||||
|
234
|
||||||
|
567
|
||||||
|
890
|
@ -0,0 +1,9 @@
|
|||||||
|
123
|
||||||
|
456
|
||||||
|
789
|
||||||
|
234
|
||||||
|
567
|
||||||
|
890
|
||||||
|
345
|
||||||
|
678
|
||||||
|
901
|
17
savenkov_alexander_lab_2/docker-compose.yml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
services:
|
||||||
|
worker-1:
|
||||||
|
build:
|
||||||
|
context: /worker-1
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- D:\Git-RViP\savenkov_alexander_lab_2\data:/var/data
|
||||||
|
- D:\Git-RViP\savenkov_alexander_lab_2\result:/var/result
|
||||||
|
worker-2:
|
||||||
|
build:
|
||||||
|
context: /worker-2
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
volumes:
|
||||||
|
- D:\Git-RViP\savenkov_alexander_lab_2\data:/var/data
|
||||||
|
- D:\Git-RViP\savenkov_alexander_lab_2\result:/var/result
|
||||||
|
depends_on:
|
||||||
|
- worker-1
|
9
savenkov_alexander_lab_2/result/data.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
987
|
||||||
|
654
|
||||||
|
321
|
||||||
|
876
|
||||||
|
543
|
||||||
|
210
|
||||||
|
765
|
||||||
|
432
|
||||||
|
100
|
1
savenkov_alexander_lab_2/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
974169.0
|
BIN
savenkov_alexander_lab_2/screens/img1.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
savenkov_alexander_lab_2/screens/img10.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
savenkov_alexander_lab_2/screens/img11.png
Normal file
After Width: | Height: | Size: 144 KiB |
BIN
savenkov_alexander_lab_2/screens/img12.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
savenkov_alexander_lab_2/screens/img13.png
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
savenkov_alexander_lab_2/screens/img14.png
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
savenkov_alexander_lab_2/screens/img15.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
savenkov_alexander_lab_2/screens/img16.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
savenkov_alexander_lab_2/screens/img17.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
savenkov_alexander_lab_2/screens/img18.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
savenkov_alexander_lab_2/screens/img2.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
savenkov_alexander_lab_2/screens/img3.png
Normal file
After Width: | Height: | Size: 49 KiB |
BIN
savenkov_alexander_lab_2/screens/img4.png
Normal file
After Width: | Height: | Size: 51 KiB |
BIN
savenkov_alexander_lab_2/screens/img5.png
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
savenkov_alexander_lab_2/screens/img6.png
Normal file
After Width: | Height: | Size: 7.1 KiB |
BIN
savenkov_alexander_lab_2/screens/img7.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
savenkov_alexander_lab_2/screens/img8.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
savenkov_alexander_lab_2/screens/img9.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
29
savenkov_alexander_lab_2/worker-1/.gitignore
vendored
Normal file
@ -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
|
8
savenkov_alexander_lab_2/worker-1/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
6
savenkov_alexander_lab_2/worker-1/.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
8
savenkov_alexander_lab_2/worker-1/.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/worker-1.iml" filepath="$PROJECT_DIR$/worker-1.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
18
savenkov_alexander_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/FileMover.java
|
||||||
|
|
||||||
|
# Запускаем Java-приложение
|
||||||
|
CMD ["java", "-cp", "/app/src", "FileMover"]
|
50
savenkov_alexander_lab_2/worker-1/src/FileMover.java
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.file.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class FileMover {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
11
savenkov_alexander_lab_2/worker-1/worker-1.iml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
||||||
|
</module>
|
29
savenkov_alexander_lab_2/worker-2/.gitignore
vendored
Normal file
@ -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
|
8
savenkov_alexander_lab_2/worker-2/.idea/.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
6
savenkov_alexander_lab_2/worker-2/.idea/misc.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
|
||||||
|
<output url="file://$PROJECT_DIR$/out" />
|
||||||
|
</component>
|
||||||
|
</project>
|
8
savenkov_alexander_lab_2/worker-2/.idea/modules.xml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/worker-2.iml" filepath="$PROJECT_DIR$/worker-2.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
18
savenkov_alexander_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/LargestNumberSquare.java
|
||||||
|
|
||||||
|
# Запускаем Java-приложение
|
||||||
|
CMD ["java", "-cp", "/app/src", "LargestNumberSquare"]
|
@ -0,0 +1,44 @@
|
|||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.FileWriter;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class LargestNumberSquare {
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
savenkov_alexander_lab_2/worker-2/worker-2.iml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
<?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>
|
||||||
|
</module>
|