README.md

В каталоге UI_Dz_lite решения ДЗ Lite

Условия ДЗ Lite

В этом задании нужно будет создать и запустить Docker-контейнер с функцией, которая осуществляет предобработку изображений перед подачей в нейронную сеть.
Приведенная ниже функция принимает путь к изображению, загружает его и готовит для подачи в полносвязную нейронную сеть: 
приводит изображение к единому размеру и нормализует данные.

Код для Python-скрипта:

from PIL import Image                           # Обработка изображений
import numpy as np                              # Работа с массивами
import argparse                                 # Модуль для извлечения аргументов, передаваемых скрипту через командную строку


def prepare_image(path):
    img = Image.open(path)                                    # Загружаем картинку по переданному пути
    print(f'Размер исходных данных: {np.array(img).shape}')   # Выводим информацию о размере исходного изображения

    img = img.resize((32, 32)).convert('L')                   # Приводим изображения к фиксированному размеру и переводим в оттенки серого
    img = np.array(img)                                       # Преобразуем изображение в numpy-массив
    img = img.reshape(1, -1)                                  # Вытягиваем в вектор
    img = img.astype('float32') / 255.                        # Нормализуем данные
    print(f'Размер данных после преобразования: {img.shape}') # Выводим информацию о новом размере данных

    with open('prepared_image.npy', 'wb') as f:               # Создаем новый файл для записи данных
        np.save(f, img)                                       # Записываем в файл обработанный numpy-массив

    print('Изображение обработано!')

Вам нужно:


    Дописать python-скрипт с приложением
    Подготовить Dockerfile для создания Docker-образа
    Создать Docker-образ
    Запустить Docker-контейнер
    Передать в контейнер любое изображение
    Обработать изображение, вызвав в контейнере команду по запуску скрипта


Решение

создания Docker-образа:

Мы уже создали и запустили собственный контейнер. Но пока никак с ним не взаимодействовали. 
Давайте теперь создадим еще один образ, который также будет осуществлять приветствие. 
Но приветствовать он будет именно нас. Для этого понадобится передать в контейнер своё имя.
И также мы познакомимся с еще одной полезной командой: docker exec.

Создаем новый python-скрипт my_app.py:

import argparse  # Модуль для извлечения аргументов, передаваемых скрипту через командную строку

# Функция суммирования
def get_sum(first_num, second_num):
    summ = first_num + second_num
    print(f'Сумма равна: {summ}')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get sum of two numbers')  # Создаем парсер для аргументов, переданных через командную строку
    parser.add_argument('first_num', type=int, help='First number')         # Задаем обязательный аргумент - первое число
    parser.add_argument('second_num', type=int, help='Second number')       # Задаем обязательный аргумент - второе число
    args = parser.parse_args()                                              # Парсим аргументы
    first_num = args.first_num                                              # Извлекаем первое число
    second_num = args.second_num                                            # Извлекаем второе число
    get_sum(first_num, second_num)                                          # Вызываем функцию суммирования


Передаем свои числа для суммы мы будем также через командную строку. Поэтому в скрипте понадобится вызвать модуль argparse. 
Он нужен для передачи значений из командной строки в выполняемый скрипт.
Далее определяется функция для приветствия, в которую передается имя того с кем нужно поздороваться.
Конструкция if __name__ == '__main__': означает, что если скрипт будет вызван, то дальше выполнятся команды, указанные в теле этого условия.
Сначала будет создан парсер для извлечения аргументов из командной строки. 
Далее указываем, что ожидается один обязательный аргумент name (тип аргумента – строка, на что указывает значение параметра type). 
После чего извлекаем имя из парсера, записываем в переменную и передаем в основную функцию say_hello

Создадим Dockerfile для создания нового образа:



FROM python:3.8
ADD my_app.py /


1.
Воспользуемся другим базовым образом для Python (python:3.8).

И здесь нам не потребуется команда CMD, выполняемая при запуске контейнера. В дальнейшем мы сами обратимся к контейнеру.


2.
Перейдем в директорию с Dockerfile и выполним команду создания образа:

docker build -t my_ui_lite .



3.
Далее запустим новый контейнер в интерактивном режиме (флаг -it), присвоив имя new-container:

docker run -it --name lite_container my_ui_lite

4.


Контейнер запущен и теперь в него можно передать команду. Для этого откроем второй экземпляр командной строки и вызовем наше приложение при помощи команды docker exec:

docker exec lite_container python my_app.py 8 9

Сначала указываем имя контейнера, к которому хотим обратиться (new-container). 
Далее следует команда, которую нужно выполнить: даем инструкцию Python запустить скрипт my_app.py с двумя аргументоми для нахождения суммы.


5. 
Фото решения  ДЗ Lite в каталоге /UI_Dz_lite/Screenshot 2024-07-20 17:26:51.png


Еще несколько команд для Dockerfile



COPY – копирует файлы и каталоги из <src> и добавляет их в файловую систему образа по пути <destination>. Команда похожа на команду ADD, но ADD обладает дополнительной функциональностью (распаковка архивов и скачивание файлов).

RUN – используется для выполнения команд из консоли. RUN может использоваться для установки необходимых зависимостей, которые потребуются для работы приложения и которых нет в базовом образе. Например: RUN pip install numpy.
Эта инструкция похожа на инструкцию CMD, но есть существенное отличие:

    RUN срабатывает, пока мы создаем образ Docker. У Dockerfile может быть много RUN-шагов, которые накладываются друг на друга для построения образа.
    CMD срабатывает, когда мы запускаем созданный образ Docker. CMD является командой по умолчанию, которая будет выполняться только при запуске контейнера без указания команды.

EXPOSE – сообщает какой из портов будет прослушиваться контейнером. Это команда понадобится, например, если мы разрабатываем web-приложение, которое обрабатывает приходящие REST-запросы.
После команды указывается порт, который нужно открыть, например, EXPOSE 8000

Создание собственного образа при помощи Dockerfile

Исходники в каталоге UI_lesson_1

Python-скрипт:

Давайте теперь создадим свой образ – что-то похожее на образ hello-world, который мы загружали до этого. 
Для этого сперва напишем скрипт Python – наше приложение.
Создайте новую директорию, где будут храниться файлы для будущего образа. 
В этой директории создайте файл с расширением .py и дайте ему название, например, my_app.py

В py-файле напишите следующий код:

print('Hello World!')
Подготовка Dockerfile

Далее создадим Dockerfile. Как уже упоминалось, Dockerfile – это обычный текстовый файл. Только без расширения .txt. 
Так что в той же директории, где лежит my_app.py, создаем текстовый файл, даем ему имя Dockerfile и удаляем расширение. 
Редактировать Dockerfile можно через любой текстовый редактор.

В Dockerfile укажем следующие команды:

FROM faucet/python3
ADD my_app.py /
CMD [ "python", "./my_app.py" ]
Разберем более подробно используемые команды.

    FROM – устанавливает базовый образ для последующих инструкций. В данном случае мы установили Python версии 3 из репозитория faucet в качестве базового образа. Теперь Dockerfile получит этот базовый образ из Docker Hub.
    Вы можете использовать и другой базовый образ Python. Найти их можно всё там же на Docker Hub, осуществив поиск по python или python3.

    ADD – копирует новые файлы, каталоги или URL-адреса удаленных файлов из <src> и добавляет их в файловую систему образа по пути <destination>. В нашем случае <src> – это my_app.py, а пункт назначения – / (то есть корневая директория).

    CMD – задает команду, которая будет выполнена в командной строке при запуске контейнера. В данном случае выполнится команда по запуску нашего приложения python ./my_app.py

Dockerfile готов, можно собирать образ!
Создание и запуск образа Docker

Откройте командную строку от имени администратора и перейдите в директорию с вашим Docker-файлом. Осталось запустить всего одну команду:

docker build -t my-image .

Флаг -t или --tag позволяет дать имя нашему образу – my-image

Точка в конце команды указывает на то, что Dockerfile лежит в текущей директории. Если предварительно не переходить в папку с Dockerfile, то вместо точки нужно будет указать путь к этой папке.

Результат запуска команды docker build

image.png

Образ получен и теперь его можно увидеть в списке образов:

image.png

Контейнер запускается уже известной командой:

docker run my-image

Результат:

image.png

Создание собственного образа при помощи Dockerfile

Исходники в каталоге UI_lesson_2

Мы уже создали и запустили собственный контейнер. Но пока никак с ним не взаимодействовали. 
Давайте теперь создадим еще один образ, который также будет осуществлять приветствие. 
Но приветствовать он будет именно нас. Для этого понадобится передать в контейнер своё имя.
И также мы познакомимся с еще одной полезной командой: docker exec.
Создаем новый python-скрипт hello_app.py. Теперь уже чуть более содержательный:
import argparse # Модуль для извлечения аргументов, передаваемых скрипту через командную строку

# Основная функция
def say_hello(name):
    print(f'Привет, {name}')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Greetings') # Создаем парсер для аргументов, переданных через командную строку
    parser.add_argument('name', type=str, help='Your name')   # Задаем один обязательный аргумент - имя
    args = parser.parse_args()                                # Парсим аргументы
    name = args.name                                          # Извлекаем имя
    say_hello(name)                                           # Передаем имя в функцию для приветствия

Передавать свое имя мы будем также через командную строку. Поэтому в скрипте понадобится вызвать модуль argparse. 
Он нужен для передачи значений из командной строки в выполняемый скрипт.
Далее определяется функция для приветствия, в которую передается имя того с кем нужно поздороваться.
Конструкция if __name__ == '__main__': означает, что если скрипт будет вызван, то дальше выполнятся команды, указанные в теле этого условия.
Сначала будет создан парсер для извлечения аргументов из командной строки. 
Далее указываем, что ожидается один обязательный аргумент name (тип аргумента – строка, на что указывает значение параметра type). 
После чего извлекаем имя из парсера, записываем в переменную и передаем в основную функцию say_hello

Создадим Dockerfile для создания нового образа:

FROM python:3.8
ADD hello_app.py /
Воспользуемся другим базовым образом для Python (python:3.8).

И здесь нам не потребуется команда CMD, выполняемая при запуске контейнера. В дальнейшем мы сами обратимся к контейнеру.

Перейдем в директорию с Dockerfile и выполним команду создания образа:

docker build -t say-hello-image .

Далее запустим новый контейнер в интерактивном режиме (флаг -it), присвоив имя new-container:

docker run -it --name new-container say-hello-image

image.png

Контейнер запущен и теперь в него можно передать команду. Для этого откроем второй экземпляр командной строки и вызовем наше приложение при помощи команды docker exec:

docker exec new-container python hello_app.py Алексей

Сначала указываем имя контейнера, к которому хотим обратиться (new-container). Далее следует команда, которую нужно выполнить: даем инструкцию Python запустить скрипт hello_app.py с одним аргументом – именем.

image.png

Теперь вы знаете как можно вызвать ваше приложение внутри контейнера!

Для выхода из интерактивного режима и завершения работы контейнера в командной строке, в которой запущен контейнер, нужно ввести команду exit()

Создание собственного образа при помощи Dockerfile

Исходники в каталоге UI_lesson_3

Давайте создадим простой Dockerfile для запуска веб-сервера на базе Nginx.

Этот пример поможет вам понять основные шаги от создания Dockerfile до запуска контейнера на вашей машине с Windows 10, где установлен Docker Desktop.

Шаг 1: Создание Dockerfile

Откройте текстовый редактор (например, Notepad++ или Visual Studio Code).

Вставьте следующий текст, который определяет базовый образ, копирует файлы в контейнер и указывает команду для запуска сервера:
# Используем официальный образ Nginx
  FROM nginx:latest

  # Копируем файлы из текущей директории в контейнер в папку /usr/share/nginx/html
  COPY . /usr/share/nginx/html

  # Открываем порт 80
  EXPOSE 80

  # Запускаем Nginx при старте контейнера
  CMD ["nginx", "-g", "daemon off;"]


Сохраните файл с именем Dockerfile в новой папке, например, C:\Users\YourUsername\nginx-example.

Шаг 2: Подготовка веб-страницы

В той же папке, где находится ваш Dockerfile (C:\Users\YourUsername\nginx-example), создайте простой HTML файл, например index.html.

##Откройте текстовый редактор и вставьте следующий HTML код:

<!DOCTYPE html>
<html>
<head>
    <title>Welcome to Nginx!</title>
</head>
<body>
    <h1>We are full stack developers from UNN</h1>
</body>
</html>

Сохраните файл как index.html в той же папке.

Шаг 3: Сборка образа Docker

Откройте Command Prompt или PowerShell.

Перейдите в директорию, где находится ваш Dockerfile:

cd C:\Users\YourUsername\nginx-example

Запустите следующую команду для сборки Docker образа:

docker build -t my-nginx .

Здесь my-nginx — это тег вашего нового образа, а точка в конце команды указывает на текущую директорию, где находится Dockerfile.

Шаг 4: Запуск Docker контейнера

После успешной сборки образа запустите контейнер:

docker run -d -p 8080:80 my-nginx

Опция -d запускает контейнер в фоновом режиме, а -p 8080:80 пробрасывает порт 80 контейнера на порт 8080 вашей машины.

Шаг 5: Проверка работы

Откройте браузер и перейдите по адресу http://localhost:8080. 
Вы должны увидеть страницу с текстом "We are full stack developers from UNN", что означает, что ваш контейнер работает корректно.
Таким образом, вы создали свой Docker образ и запустили из него контейнер, который работает как веб-сервер Nginx, отдающий статическую HTML страницу.

Полезные ссылки

№1 платформа AI курсов (in Russian)


Работа с проектом

Команды

Реестр пакетов

Компании

CI/CD

API

Панель администратора

Общая информация

Конвейеры
0 успешных
0 с ошибкой