Merge pull request 'martysheva_tamara_lab_2 is ready' (#50) from martysheva_tamara_lab_2 into main
Reviewed-on: http://student.git.athene.tech/Alexey/DAS_2023_1/pulls/50
This commit is contained in:
commit
5a1e7cb698
69
martysheva_tamara_lab_2/README.md
Normal file
69
martysheva_tamara_lab_2/README.md
Normal file
@ -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 "")
|
18
martysheva_tamara_lab_2/docker-compose.yml
Normal file
18
martysheva_tamara_lab_2/docker-compose.yml
Normal file
@ -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 #том для папки результатов
|
BIN
martysheva_tamara_lab_2/images/downloading.jpg
Normal file
BIN
martysheva_tamara_lab_2/images/downloading.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 93 KiB |
BIN
martysheva_tamara_lab_2/images/files.jpg
Normal file
BIN
martysheva_tamara_lab_2/images/files.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 53 KiB |
BIN
martysheva_tamara_lab_2/images/result-dockerhub.jpg
Normal file
BIN
martysheva_tamara_lab_2/images/result-dockerhub.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
BIN
martysheva_tamara_lab_2/images/result-files.jpg
Normal file
BIN
martysheva_tamara_lab_2/images/result-files.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
1
martysheva_tamara_lab_2/var/data/1.txt
Normal file
1
martysheva_tamara_lab_2/var/data/1.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
4
|
5
martysheva_tamara_lab_2/var/data/2.txt
Normal file
5
martysheva_tamara_lab_2/var/data/2.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
23
|
||||||
|
4
|
||||||
|
123
|
||||||
|
46
|
||||||
|
15
|
15
martysheva_tamara_lab_2/var/data/3.txt
Normal file
15
martysheva_tamara_lab_2/var/data/3.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
100
|
||||||
|
121
|
||||||
|
125
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
15
martysheva_tamara_lab_2/var/result/data.txt
Normal file
15
martysheva_tamara_lab_2/var/result/data.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
||||||
|
4
|
||||||
|
5
|
||||||
|
6
|
||||||
|
7
|
||||||
|
8
|
||||||
|
9
|
||||||
|
100
|
||||||
|
121
|
||||||
|
125
|
||||||
|
1
|
||||||
|
2
|
||||||
|
3
|
1
martysheva_tamara_lab_2/var/result/result.txt
Normal file
1
martysheva_tamara_lab_2/var/result/result.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
15625.0
|
BIN
martysheva_tamara_lab_2/video.mkv
Normal file
BIN
martysheva_tamara_lab_2/video.mkv
Normal file
Binary file not shown.
11
martysheva_tamara_lab_2/worker1/Dockerfile
Normal file
11
martysheva_tamara_lab_2/worker1/Dockerfile
Normal file
@ -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-приложения
|
40
martysheva_tamara_lab_2/worker1/src/Main.java
Normal file
40
martysheva_tamara_lab_2/worker1/src/Main.java
Normal file
@ -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<Path> 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<Path> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
11
martysheva_tamara_lab_2/worker2/Dockerfile
Normal file
11
martysheva_tamara_lab_2/worker2/Dockerfile
Normal file
@ -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-приложения
|
50
martysheva_tamara_lab_2/worker2/src/Main.java
Normal file
50
martysheva_tamara_lab_2/worker2/src/Main.java
Normal file
@ -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<Integer> 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<Integer> readNumbersFromFile(Path dataFile) throws IOException {
|
||||||
|
List<Integer> 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<Integer> numbers) {
|
||||||
|
int maxNumber = Integer.MIN_VALUE;
|
||||||
|
for (int number : numbers) {
|
||||||
|
if (number > maxNumber) {
|
||||||
|
maxNumber = number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxNumber;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user