diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json new file mode 100644 index 0000000..f91c81d --- /dev/null +++ b/.vscode/PythonImportHelper-v2-Completion.json @@ -0,0 +1,182 @@ +[ + { + "label": "os", + "kind": 6, + "isExtraImport": true, + "importPath": "os", + "description": "os", + "detail": "os", + "documentation": {} + }, + { + "label": "shutil", + "kind": 6, + "isExtraImport": true, + "importPath": "shutil", + "description": "shutil", + "detail": "shutil", + "documentation": {} + }, + { + "label": "random", + "kind": 6, + "isExtraImport": true, + "importPath": "random", + "description": "random", + "detail": "random", + "documentation": {} + }, + { + "label": "string", + "kind": 6, + "isExtraImport": true, + "importPath": "string", + "description": "string", + "detail": "string", + "documentation": {} + }, + { + "label": "count_lines", + "kind": 2, + "importPath": "vaksman_valerya_lab_2.app_one.First", + "description": "vaksman_valerya_lab_2.app_one.First", + "peekOfCode": "def count_lines(filepath):\n with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:\n return sum(1 for _ in f)\n# Старт поиска файла по условию (самое большое кол-во строк)\nmax_lines = 0\nmax_file = None\nfor filename in os.listdir(source_dir):\n file_path = os.path.join(source_dir, filename)\n if os.path.isfile(file_path):\n lines = count_lines(file_path)", + "detail": "vaksman_valerya_lab_2.app_one.First", + "documentation": {} + }, + { + "label": "source_dir", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_one.First", + "description": "vaksman_valerya_lab_2.app_one.First", + "peekOfCode": "source_dir = '/var/data'\ndestination_file = '/var/result/data.txt'\n# Простая функция дл подсчёта строк в файле. Настроили для работы с кириллицей (utf-8)\ndef count_lines(filepath):\n with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:\n return sum(1 for _ in f)\n# Старт поиска файла по условию (самое большое кол-во строк)\nmax_lines = 0\nmax_file = None\nfor filename in os.listdir(source_dir):", + "detail": "vaksman_valerya_lab_2.app_one.First", + "documentation": {} + }, + { + "label": "destination_file", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_one.First", + "description": "vaksman_valerya_lab_2.app_one.First", + "peekOfCode": "destination_file = '/var/result/data.txt'\n# Простая функция дл подсчёта строк в файле. Настроили для работы с кириллицей (utf-8)\ndef count_lines(filepath):\n with open(filepath, 'r', encoding='utf-8', errors='ignore') as f:\n return sum(1 for _ in f)\n# Старт поиска файла по условию (самое большое кол-во строк)\nmax_lines = 0\nmax_file = None\nfor filename in os.listdir(source_dir):\n file_path = os.path.join(source_dir, filename)", + "detail": "vaksman_valerya_lab_2.app_one.First", + "documentation": {} + }, + { + "label": "max_lines", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_one.First", + "description": "vaksman_valerya_lab_2.app_one.First", + "peekOfCode": "max_lines = 0\nmax_file = None\nfor filename in os.listdir(source_dir):\n file_path = os.path.join(source_dir, filename)\n if os.path.isfile(file_path):\n lines = count_lines(file_path)\n if lines > max_lines:\n max_lines = lines\n max_file = file_path\n# Копирование файла с самым большим кол-вом строчек в нужную директорию", + "detail": "vaksman_valerya_lab_2.app_one.First", + "documentation": {} + }, + { + "label": "max_file", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_one.First", + "description": "vaksman_valerya_lab_2.app_one.First", + "peekOfCode": "max_file = None\nfor filename in os.listdir(source_dir):\n file_path = os.path.join(source_dir, filename)\n if os.path.isfile(file_path):\n lines = count_lines(file_path)\n if lines > max_lines:\n max_lines = lines\n max_file = file_path\n# Копирование файла с самым большим кол-вом строчек в нужную директорию\nif max_file:", + "detail": "vaksman_valerya_lab_2.app_one.First", + "documentation": {} + }, + { + "label": "input_file", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_two.Second", + "description": "vaksman_valerya_lab_2.app_two.Second", + "peekOfCode": "input_file = './var/data/data.txt'\noutput_file = './var/result/result.txt'\n# Поиск наименьшего числа в файле\nwith open(input_file, 'r') as f:\n numbers = [float(line.strip()) for line in f if line.strip()]\n# Искомое min число\nmin_number = min(numbers)\ncubed_number = min_number ** 3\n# Сохранение\nwith open(output_file, 'w') as f:", + "detail": "vaksman_valerya_lab_2.app_two.Second", + "documentation": {} + }, + { + "label": "output_file", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_two.Second", + "description": "vaksman_valerya_lab_2.app_two.Second", + "peekOfCode": "output_file = './var/result/result.txt'\n# Поиск наименьшего числа в файле\nwith open(input_file, 'r') as f:\n numbers = [float(line.strip()) for line in f if line.strip()]\n# Искомое min число\nmin_number = min(numbers)\ncubed_number = min_number ** 3\n# Сохранение\nwith open(output_file, 'w') as f:\n f.write(str(cubed_number))", + "detail": "vaksman_valerya_lab_2.app_two.Second", + "documentation": {} + }, + { + "label": "min_number", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_two.Second", + "description": "vaksman_valerya_lab_2.app_two.Second", + "peekOfCode": "min_number = min(numbers)\ncubed_number = min_number ** 3\n# Сохранение\nwith open(output_file, 'w') as f:\n f.write(str(cubed_number))\nprint(f\"Наименьшее число: {min_number}\\nЕго третья степень: {cubed_number}\\nРезультат сохранён в {output_file}\")", + "detail": "vaksman_valerya_lab_2.app_two.Second", + "documentation": {} + }, + { + "label": "cubed_number", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.app_two.Second", + "description": "vaksman_valerya_lab_2.app_two.Second", + "peekOfCode": "cubed_number = min_number ** 3\n# Сохранение\nwith open(output_file, 'w') as f:\n f.write(str(cubed_number))\nprint(f\"Наименьшее число: {min_number}\\nЕго третья степень: {cubed_number}\\nРезультат сохранён в {output_file}\")", + "detail": "vaksman_valerya_lab_2.app_two.Second", + "documentation": {} + }, + { + "label": "generate_random_file", + "kind": 2, + "importPath": "vaksman_valerya_lab_2.file_generator.Generator", + "description": "vaksman_valerya_lab_2.file_generator.Generator", + "peekOfCode": "def generate_random_file(filename):\n # Рандомное кол-во строк в файле\n num_lines = random.randint(1, 100)\n with open(filename, 'w') as f:\n for _ in range(num_lines):\n # Для полного швепса выбираем случайное число\n random_number = random.randint(0, 1000)\n f.write(f\"{random_number}\\n\")\n# Запускаем генерацию нашего набора файлов\nfor i in range(num_files):", + "detail": "vaksman_valerya_lab_2.file_generator.Generator", + "documentation": {} + }, + { + "label": "output_dir", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.file_generator.Generator", + "description": "vaksman_valerya_lab_2.file_generator.Generator", + "peekOfCode": "output_dir = './var/data'\n# Проверка на наличие таковой\nos.makedirs(output_dir, exist_ok=True)\n# Генерируем случайное кол-во файлов (1-15)\nnum_files = random.randint(1, 15)\n# Случайное по всем статьям заполнение файла\ndef generate_random_file(filename):\n # Рандомное кол-во строк в файле\n num_lines = random.randint(1, 100)\n with open(filename, 'w') as f:", + "detail": "vaksman_valerya_lab_2.file_generator.Generator", + "documentation": {} + }, + { + "label": "num_files", + "kind": 5, + "importPath": "vaksman_valerya_lab_2.file_generator.Generator", + "description": "vaksman_valerya_lab_2.file_generator.Generator", + "peekOfCode": "num_files = random.randint(1, 15)\n# Случайное по всем статьям заполнение файла\ndef generate_random_file(filename):\n # Рандомное кол-во строк в файле\n num_lines = random.randint(1, 100)\n with open(filename, 'w') as f:\n for _ in range(num_lines):\n # Для полного швепса выбираем случайное число\n random_number = random.randint(0, 1000)\n f.write(f\"{random_number}\\n\")", + "detail": "vaksman_valerya_lab_2.file_generator.Generator", + "documentation": {} + }, + { + "label": "find_shortest_filename", + "kind": 2, + "importPath": "zhimolostnova_anna_lab_2.first_app.app", + "description": "zhimolostnova_anna_lab_2.first_app.app", + "peekOfCode": "def find_shortest_filename(source_dir, result_file):\n # Существует ли папка result? Если нет, то создается\n result_dir = os.path.dirname(result_file)\n if not os.path.exists(result_dir):\n os.makedirs(result_dir)\n print(f\"Created directory {result_dir}\")\n # Поиск файлов в исходной директории\n files = [f for f in os.listdir(source_dir) if os.path.isfile(os.path.join(source_dir, f))]\n if not files:\n print(f\"No files found in {source_dir}\")", + "detail": "zhimolostnova_anna_lab_2.first_app.app", + "documentation": {} + }, + { + "label": "generate_random_filename", + "kind": 2, + "importPath": "zhimolostnova_anna_lab_2.generator.generate_files", + "description": "zhimolostnova_anna_lab_2.generator.generate_files", + "peekOfCode": "def generate_random_filename(length):\n return ''.join(random.choices(string.ascii_lowercase + string.digits, k=length)) + '.txt'\ndef generate_data_files(directory, num_files, min_lines, max_lines):\n # Создание директории, если таковой не существует\n if not os.path.exists(directory):\n os.makedirs(directory)\n # Проверка, пустая ли директория\n if os.listdir(directory):\n print(f\"{directory} is not empty, skipping file generation.\")\n return", + "detail": "zhimolostnova_anna_lab_2.generator.generate_files", + "documentation": {} + }, + { + "label": "generate_data_files", + "kind": 2, + "importPath": "zhimolostnova_anna_lab_2.generator.generate_files", + "description": "zhimolostnova_anna_lab_2.generator.generate_files", + "peekOfCode": "def generate_data_files(directory, num_files, min_lines, max_lines):\n # Создание директории, если таковой не существует\n if not os.path.exists(directory):\n os.makedirs(directory)\n # Проверка, пустая ли директория\n if os.listdir(directory):\n print(f\"{directory} is not empty, skipping file generation.\")\n return\n # Генерация файлов\n for _ in range(num_files):", + "detail": "zhimolostnova_anna_lab_2.generator.generate_files", + "documentation": {} + }, + { + "label": "find_smallest_number_and_cube", + "kind": 2, + "importPath": "zhimolostnova_anna_lab_2.second_app.app", + "description": "zhimolostnova_anna_lab_2.second_app.app", + "peekOfCode": "def find_smallest_number_and_cube(input_file, output_file):\n # Проверка, существует ли файл data.txt\n if not os.path.exists(input_file):\n print(f\"File {input_file} does not exist.\")\n return\n # Чтение чисел из файла\n with open(input_file, 'r') as f:\n numbers = [int(line.strip()) for line in f.readlines()]\n if numbers:\n smallest_number = min(numbers)", + "detail": "zhimolostnova_anna_lab_2.second_app.app", + "documentation": {} + } +] \ No newline at end of file diff --git a/vaksman_valerya_lab_2/.env b/vaksman_valerya_lab_2/.env new file mode 100644 index 0000000..c03a118 --- /dev/null +++ b/vaksman_valerya_lab_2/.env @@ -0,0 +1,4 @@ +DB_HOST = db +DB_USER = wordpress +DB_PASSWORD = wordpress +DB_NAME = wordpress \ No newline at end of file diff --git a/vaksman_valerya_lab_2/.gitignote b/vaksman_valerya_lab_2/.gitignote new file mode 100644 index 0000000..bc0685a --- /dev/null +++ b/vaksman_valerya_lab_2/.gitignote @@ -0,0 +1,3 @@ +result/ +data/ +.vscode/ \ No newline at end of file diff --git a/vaksman_valerya_lab_2/README.md b/vaksman_valerya_lab_2/README.md new file mode 100644 index 0000000..589769b --- /dev/null +++ b/vaksman_valerya_lab_2/README.md @@ -0,0 +1,129 @@ +# Лабораторная работа №2 - Знакомство с docker и docker-compose + +## Задание + +Разверните 3 сервиса на выбор в контейнерах docker с помощью docker-compose, учитывая следующие требования: + +* Несколько контейнеров. +* Хотя бы один volume. +* Хотя бы один порт, проброшенный на хост. +* Разворачивание системы должно пройти до конца. + +## Запуск + +Введение в терминале команды: +``` +docker-compose up -d +``` + +# Выбранные сервисы + + 1. ```db``` - самая новая версия БД MaraiDB + + 2. ```phpmyadmin``` - система управления базой данных + + 3. ```mediawiki``` - движок вики + + 4. ```wordpress``` - платформа для управления контентом + + +## Описание работы: + +Были развёрнуты следующие сервисы: + +### phpmyadmin + +``` +phpmyadmin: + depends_on: + - db + image: phpmyadmin + hostname: php_my_admin + container_name: php_my_admin + volumes: # см. конец файла + - php_my_admin_data:/var/www/html + ports: + - 8080:80 + restart: always + environment: + PMA_ARBITRARY: 1 + TZ: "Europe/Moscow" + PMA_HOST: ${DB_HOST} + PMA_USER : ${DB_USER} + PMA_PASSWORD : ${DB_PASSWORD} +``` + +Этот код представляет собой часть файла конфигурации ```Docker Compose```, который используется для управления многоконтейнерными приложениями в Docker. + +#### Объяснение работы кода: + +Эта строка отвечает за образ сброки: +``` +image: phpmyadmin +``` +Задание имени контейнера: +``` +container_name: php_my_admin +``` +Проброс портов: +``` +ports: + - 8080:80 +``` +Тома для хранения данных: +``` +volumes: + - .php_my_admin_data:/var/www/html + +``` +Переменные окружения для Drupal +``` +environment: + PMA_ARBITRARY: 1 + TZ: "Europe/Moscow" + PMA_HOST: ${DB_HOST} + PMA_USER : ${DB_USER} + PMA_PASSWORD : ${DB_PASSWORD} + +``` +Аналогично со другими сервисами: + +### mediawiki + +``` + image: mediawiki:latest # образ MediaWiki + container_name: mediawiki_app + volumes: # см. конец файла + - ./mediawiki_data:/var/www/html/mediawiki + ports: + - "8088:80" + restart: always +``` + +### Wordpress + +``` + depends_on: + - db + image: wordpress:latest + hostname: wp_app + container_name: wp_app + volumes: # см. конец файла + - wordpress_data:/var/www/html + ports: + - "8000:80" + restart: always + user: www-data + environment: # секция настроек для подключения wordpress к БД + TZ: "Europe/Moscow" + WORDPRESS_DB_HOST: ${DB_HOST} + WORDPRESS_DB_USER: ${DB_USER} + WORDPRESS_DB_PASSWORD: ${DB_PASSWORD} + WORDPRESS_DB_NAME: ${DB_NAME} +``` +# Скриншот работы +Панель консоли +![](1.png "") + +# ВК +https://vk.com/video256017065_456239870?list=ln-qWUdZke5z53x940ZHv \ No newline at end of file diff --git a/vaksman_valerya_lab_2/app_one/Dockerfile b/vaksman_valerya_lab_2/app_one/Dockerfile new file mode 100644 index 0000000..37963ad --- /dev/null +++ b/vaksman_valerya_lab_2/app_one/Dockerfile @@ -0,0 +1,11 @@ +# Официальный образ Python 3.10 +FROM python:3.10-slim + +# Установка рабочей директории +WORKDIR /app + +# Копирование всех (в данном случае одного) файлов в контейнер +COPY First.py /app/ + +# Запуск программы +CMD ["python", "First.py"] \ No newline at end of file diff --git a/vaksman_valerya_lab_2/app_one/First.py b/vaksman_valerya_lab_2/app_one/First.py new file mode 100644 index 0000000..ee66932 --- /dev/null +++ b/vaksman_valerya_lab_2/app_one/First.py @@ -0,0 +1,31 @@ +import os +import shutil + +# Пути к директориии для поиска и файла для сохранения +source_dir = '/var/data' +destination_file = '/var/result/data.txt' + +# Простая функция дл подсчёта строк в файле. Настроили для работы с кириллицей (utf-8) +def count_lines(filepath): + with open(filepath, 'r', encoding='utf-8', errors='ignore') as f: + return sum(1 for _ in f) + +# Старт поиска файла по условию (самое большое кол-во строк) +max_lines = 0 +max_file = None + +for filename in os.listdir(source_dir): + file_path = os.path.join(source_dir, filename) + + if os.path.isfile(file_path): + lines = count_lines(file_path) + if lines > max_lines: + max_lines = lines + max_file = file_path + +# Копирование файла с самым большим кол-вом строчек в нужную директорию +if max_file: + shutil.copy(max_file, destination_file) + print(f"{max_file} с кол-вом строк {max_lines} был перемещен в {destination_file}") +else: + print("Указанная директория пустая :(") \ No newline at end of file diff --git a/vaksman_valerya_lab_2/app_two/Dockerfile b/vaksman_valerya_lab_2/app_two/Dockerfile new file mode 100644 index 0000000..1c75dc7 --- /dev/null +++ b/vaksman_valerya_lab_2/app_two/Dockerfile @@ -0,0 +1,11 @@ +# Официальный образ Python 3.10 +FROM python:3.10-slim + +# Установка рабочей директории +WORKDIR /app + +# Копирование всех (в данном случае одного) файлов в контейнер +COPY Second.py /app/ + +# Запуск программы +CMD ["python", "Second.py"] \ No newline at end of file diff --git a/vaksman_valerya_lab_2/app_two/Second.py b/vaksman_valerya_lab_2/app_two/Second.py new file mode 100644 index 0000000..b6dfd31 --- /dev/null +++ b/vaksman_valerya_lab_2/app_two/Second.py @@ -0,0 +1,18 @@ +# Пути к директориии c файлами для поиска и сохранения +input_file = './var/data/data.txt' +output_file = './var/result/result.txt' + +# Поиск наименьшего числа в файле +with open(input_file, 'r') as f: + numbers = [float(line.strip()) for line in f if line.strip()] + +# Искомое min число +min_number = min(numbers) + +cubed_number = min_number ** 3 + +# Сохранение +with open(output_file, 'w') as f: + f.write(str(cubed_number)) + +print(f"Наименьшее число: {min_number}\nЕго третья степень: {cubed_number}\nРезультат сохранён в {output_file}") diff --git a/vaksman_valerya_lab_2/docker-compose.yaml b/vaksman_valerya_lab_2/docker-compose.yaml new file mode 100644 index 0000000..f5a0b07 --- /dev/null +++ b/vaksman_valerya_lab_2/docker-compose.yaml @@ -0,0 +1,25 @@ +services: + # Сервис файлового генератора + generator: + build: + context: ./file_generator # Путь к директории с Dockerfile + + # Сервис первой программы + app_one: + depends_on: # повесили ожидание запуска генератора файлов + - generator + build: + context: ./app_one/ # Путь к директории с Dockerfile + volumes: + - ./data:/var/data + - ./result:/var/result + + # Сервис второй программы + app_two: + depends_on: # повесили ожидание запуска первой программы + - app_one + build: + context: ./app_two/ # Путь к директории с Dockerfile + volumes: + - ./data:/var/data + - ./result:/var/result \ No newline at end of file diff --git a/vaksman_valerya_lab_2/file_generator/Dockerfile b/vaksman_valerya_lab_2/file_generator/Dockerfile new file mode 100644 index 0000000..04de305 --- /dev/null +++ b/vaksman_valerya_lab_2/file_generator/Dockerfile @@ -0,0 +1,11 @@ +# Официальный образ Python 3.10 +FROM python:3.10-slim + +# Установка рабочей директории +WORKDIR /app + +# Копирование всех (в данном случае одного) файлов в контейнер +COPY Generator.py /app/ + +# Запуск программы +CMD ["python", "Generator.py"] \ No newline at end of file diff --git a/vaksman_valerya_lab_2/file_generator/Generator.py b/vaksman_valerya_lab_2/file_generator/Generator.py new file mode 100644 index 0000000..08121b9 --- /dev/null +++ b/vaksman_valerya_lab_2/file_generator/Generator.py @@ -0,0 +1,31 @@ +import os +import random + +# Директория для генерации файлов +output_dir = './var/data' + +# Проверка на наличие таковой +os.makedirs(output_dir, exist_ok=True) + +# Генерируем случайное кол-во файлов (1-15) +num_files = random.randint(1, 15) + +# Случайное по всем статьям заполнение файла +def generate_random_file(filename): + + # Рандомное кол-во строк в файле + num_lines = random.randint(1, 100) + + with open(filename, 'w') as f: + for _ in range(num_lines): + # Для полного швепса выбираем случайное число + random_number = random.randint(0, 1000) + f.write(f"{random_number}\n") + +# Запускаем генерацию нашего набора файлов +for i in range(num_files): + filename = os.path.join(output_dir, f'random_file_{i + 1}.txt') + generate_random_file(filename) + print(f"Генерация файла {filename}.") + +print(f"Общее кол-во сгенерированных файлов: {num_files}")