|
|
@ -5,14 +5,28 @@
|
|
|
|
В полученной вами директории `todo_app` находятся исходные коды Enterprise Quality™® системы для менеджмента напоминаний.
|
|
|
|
В полученной вами директории `todo_app` находятся исходные коды Enterprise Quality™® системы для менеджмента напоминаний.
|
|
|
|
|
|
|
|
|
|
|
|
Она состоит из следующих частей:
|
|
|
|
Она состоит из следующих частей:
|
|
|
|
- `TodoApi` - API-сервис, на платформе `.NET 7`.
|
|
|
|
- `TodoApi` - API-сервис, на платформе `.NET 7`,
|
|
|
|
- `todo_ui` - веб-интерфейс к этому сервису, Single-Page `JavaScript` приложение(`SPA`), написанное с использованием `Vue.js 3`.
|
|
|
|
- `todo_ui` - веб-интерфейс к этому сервису, Single-Page `JavaScript` приложение(`SPA`), написанное с использованием `Vue.js 3`,
|
|
|
|
- API-сервис использует `PostgreSQL` для хранения данных.
|
|
|
|
- `PostgreSQL` - API-сервис использует `PostgreSQL` для хранения данных.
|
|
|
|
|
|
|
|
|
|
|
|
Необходимо будет контейнеризировать эту систему.
|
|
|
|
Необходимо будет контейнеризировать эту систему.
|
|
|
|
|
|
|
|
|
|
|
|
Сервис TodoApi имеет следующие шаги сборки:
|
|
|
|
#### 1 Контейнеризация приложения
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### 1.1 Подготовка образа для `TodoApi` и `todo_ui`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Используя подход к многоступенчатой сборке образов, напишите `Dockerfile`, из которого можно было бы создать образ, \
|
|
|
|
|
|
|
|
и который отвечал бы следующим требованиям:
|
|
|
|
|
|
|
|
- Фаза сборки API-сервиса должна использовать образ `mcr.microsoft.com/dotnet/sdk:7.0`
|
|
|
|
|
|
|
|
- Фаза сборки `JavaScript` приложения должна использовать образ `node:21`
|
|
|
|
|
|
|
|
- Результирующий образ должен основываться на `mcr.microsoft.com/dotnet/aspnet:7.0`
|
|
|
|
|
|
|
|
- Готовое приложение API-сервиса вместе с зависимостями должно находиться в директории `/app`
|
|
|
|
|
|
|
|
- `JavaScript` приложение должно находиться в директории `/app/wwwroot`
|
|
|
|
|
|
|
|
- При старте контейнера из такого образа, должно запускаться приложение API-сервиса.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Документация по многоступенчатой сборке образов находится тут: https://docs.docker.com/build/building/multi-stage/.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Фаза сборки сервиса `TodoApi` состоит из следующих шагов:
|
|
|
|
- Во-первых, для его сборки необходим .NET 7 SDK
|
|
|
|
- Во-первых, для его сборки необходим .NET 7 SDK
|
|
|
|
- Далее, из директории, в которой находятся исходные коды сервиса(см. `todo_app/TodoApi`), \
|
|
|
|
- Далее, из директории, в которой находятся исходные коды сервиса(см. `todo_app/TodoApi`), \
|
|
|
|
нужно сделать `dotnet restore TodoApi.csproj` - эта команда скачает зависимости сервиса.
|
|
|
|
нужно сделать `dotnet restore TodoApi.csproj` - эта команда скачает зависимости сервиса.
|
|
|
@ -30,8 +44,7 @@
|
|
|
|
Запуск осуществляется вызовом исполняемого файла `./TodoApi` из директории, которая хранит опубликованные \
|
|
|
|
Запуск осуществляется вызовом исполняемого файла `./TodoApi` из директории, которая хранит опубликованные \
|
|
|
|
бинарные файлы сервиса и его зависимостей.
|
|
|
|
бинарные файлы сервиса и его зависимостей.
|
|
|
|
|
|
|
|
|
|
|
|
`JavaScript` приложение собирается следующим образом:
|
|
|
|
Фаза сборки `JavaScript` приложения состоит из следующих шагов:
|
|
|
|
|
|
|
|
|
|
|
|
- Прежде всего, необходим `NodeJS` - в данном случае подойдет версия `21`.
|
|
|
|
- Прежде всего, необходим `NodeJS` - в данном случае подойдет версия `21`.
|
|
|
|
- Далее, из директории, в которой находятся исходные коды приложения(см. `todo_app/todo_ui`), \
|
|
|
|
- Далее, из директории, в которой находятся исходные коды приложения(см. `todo_app/todo_ui`), \
|
|
|
|
нужно вызывать `npm install` - это команда скачает зависимости приложения.
|
|
|
|
нужно вызывать `npm install` - это команда скачает зависимости приложения.
|
|
|
@ -45,22 +58,11 @@
|
|
|
|
Для хостинга JS-приложения в API-сервисе, необходимо всего лишь скопировать упомянутую выше директорию \
|
|
|
|
Для хостинга JS-приложения в API-сервисе, необходимо всего лишь скопировать упомянутую выше директорию \
|
|
|
|
`wwwroot` внутрь результирующей директории API-сервиса(которая получается после выполнения `dotnet publish ...`).
|
|
|
|
`wwwroot` внутрь результирующей директории API-сервиса(которая получается после выполнения `dotnet publish ...`).
|
|
|
|
|
|
|
|
|
|
|
|
#### Задачи.
|
|
|
|
Создайте образ из полученного `Dockerfile` и назовите его `todo-bundle`.
|
|
|
|
|
|
|
|
|
|
|
|
1. Напишите `Dockerfile`, из которого можно было бы создать образ, и который отвечал бы следующим требованиям:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
- Фаза сборки API-сервиса должна использовать образ `mcr.microsoft.com/dotnet/sdk:7.0`
|
|
|
|
|
|
|
|
- Фаза сборки `JavaScript` приложения должна использовать образ `node:21`
|
|
|
|
|
|
|
|
- Результирующий образ должен основываться на `mcr.microsoft.com/dotnet/aspnet:7.0`
|
|
|
|
|
|
|
|
- Готовое приложение API-сервиса вместе с зависимостями должно находиться в директории `/app`
|
|
|
|
|
|
|
|
- `JavaScript` приложение должно находиться в директории `/app/wwwroot`
|
|
|
|
|
|
|
|
- При старте контейнера из такого образа, должен запускаться приложение API-сервиса.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Документация по многоступенчатой сборке образов находится тут: https://docs.docker.com/build/building/multi-stage/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. Создайте образ из полученного `Dockerfile` и назовите его `todo-bundle`
|
|
|
|
##### 1.2 Подготовка образа PostgreSQL
|
|
|
|
|
|
|
|
|
|
|
|
3. Перед запуском самого приложения, необходимо запустить и подготовить `PostgreSQL` в сети `todo`.
|
|
|
|
Перед запуском самого приложения, необходимо запустить и подготовить `PostgreSQL` в сети `todo`.
|
|
|
|
|
|
|
|
|
|
|
|
Создайте именованную сеть типа `bridge`, в которой будет работать вся система, назовите ее `todo`.
|
|
|
|
Создайте именованную сеть типа `bridge`, в которой будет работать вся система, назовите ее `todo`.
|
|
|
|
|
|
|
|
|
|
|
@ -76,7 +78,9 @@
|
|
|
|
4. Примонтируйте директорию `initdb` из `todo_app` в качестве директории `/docker-entrypoint-initdb.d` внутри контейнера. \
|
|
|
|
4. Примонтируйте директорию `initdb` из `todo_app` в качестве директории `/docker-entrypoint-initdb.d` внутри контейнера. \
|
|
|
|
Там находится скрипт `init_db.sql`, который используется для инициализации базы данных при первом старте контейнера.
|
|
|
|
Там находится скрипт `init_db.sql`, который используется для инициализации базы данных при первом старте контейнера.
|
|
|
|
|
|
|
|
|
|
|
|
4. Запустите контейнер `todo_bundle` в сети `todo` из созданного вами образа `todo-bundle`, при этом:
|
|
|
|
##### 1.3 Проверка работоспособности контейнеризованного приложения
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Запустите контейнер `todo_bundle` в сети `todo` из созданного вами образа `todo-bundle`, при этом:
|
|
|
|
- Установите значение переменной среды `ConnectionStrings__PostgreSQL` в контейнере равной \
|
|
|
|
- Установите значение переменной среды `ConnectionStrings__PostgreSQL` в контейнере равной \
|
|
|
|
`Host=todo_postgres;Port=5432;Database=todo;Username=todo;Password=todo`.
|
|
|
|
`Host=todo_postgres;Port=5432;Database=todo;Username=todo;Password=todo`.
|
|
|
|
Можете выбрать другой `Host` в этой строке, если вы назвали контейнер с PostgreSQL по-другому.
|
|
|
|
Можете выбрать другой `Host` в этой строке, если вы назвали контейнер с PostgreSQL по-другому.
|
|
|
@ -91,7 +95,11 @@
|
|
|
|
При возникновении сложностей и необходимости отладки, вы можете также установить значение переменной \
|
|
|
|
При возникновении сложностей и необходимости отладки, вы можете также установить значение переменной \
|
|
|
|
`ASPNETCORE_ENVIRONMENT` в `Development` - таким образом сервис будет выдавать больше логов.
|
|
|
|
`ASPNETCORE_ENVIRONMENT` в `Development` - таким образом сервис будет выдавать больше логов.
|
|
|
|
|
|
|
|
|
|
|
|
5. Несмотря на то что API-сервис поддерживает хостинг `JavaScript` приложения, в реальном(или скорее, идеальном) мире \
|
|
|
|
#### 2 Рефакторинг контейнеризованного приложения
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### 1.1 Декомпозиция образа `todo-bundle`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Несмотря на то что API-сервис поддерживает хостинг `JavaScript` приложения, в реальном(или скорее, идеальном) мире \
|
|
|
|
никто так не делает. Над интерфейсом и API часто работают разные команды, у них может быть разный график работы, \
|
|
|
|
никто так не делает. Над интерфейсом и API часто работают разные команды, у них может быть разный график работы, \
|
|
|
|
разное версионирование приложений, и тем более разные репозитарии, и разный подход к разработке.
|
|
|
|
разное версионирование приложений, и тем более разные репозитарии, и разный подход к разработке.
|
|
|
|
|
|
|
|
|
|
|
@ -119,9 +127,11 @@
|
|
|
|
При сборке образа копируйте написанную вами конфигурацию Nginx в `/etc/nginx/nginx.conf`, \
|
|
|
|
При сборке образа копируйте написанную вами конфигурацию Nginx в `/etc/nginx/nginx.conf`, \
|
|
|
|
а результат сборки `JavaScript` приложения в `/var/www/todo`.
|
|
|
|
а результат сборки `JavaScript` приложения в `/var/www/todo`.
|
|
|
|
|
|
|
|
|
|
|
|
Создайте образ `todo-ui` из этого докер-файла
|
|
|
|
Создайте образ `todo-ui` из этого докер-файла.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### 1.2 Проверка работоспособности контейнеризованного приложения
|
|
|
|
|
|
|
|
|
|
|
|
6. Запустите в сети `todo` контейнер `todo_api` из образа `todo-api`, при этом:
|
|
|
|
Запустите в сети `todo` контейнер `todo_api` из образа `todo-api`, при этом:
|
|
|
|
- Не забудьте про переменную среды `ConnectionStrings__PostgreSQL`.
|
|
|
|
- Не забудьте про переменную среды `ConnectionStrings__PostgreSQL`.
|
|
|
|
- Убедитесь что контейнер недоступен из внешней сети.
|
|
|
|
- Убедитесь что контейнер недоступен из внешней сети.
|
|
|
|
|
|
|
|
|
|
|
@ -131,7 +141,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
Убедитесь что приложение доступно извне и работает.
|
|
|
|
Убедитесь что приложение доступно извне и работает.
|
|
|
|
|
|
|
|
|
|
|
|
7. Платформа `.NET`, на самом деле, позволяет собирать приложения, отвязанные от "внешней" предустановленной \
|
|
|
|
##### 1.3 Рефакторинг образа `todo-api`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Платформа `.NET`, на самом деле, позволяет собирать приложения, отвязанные от "внешней" предустановленной \
|
|
|
|
среды выполнения.
|
|
|
|
среды выполнения.
|
|
|
|
|
|
|
|
|
|
|
|
Хотя рекомендованный способ докеризации приложений на `.NET` - отталкиваться от образа с `mcr.microsoft.com`,
|
|
|
|
Хотя рекомендованный способ докеризации приложений на `.NET` - отталкиваться от образа с `mcr.microsoft.com`,
|
|
|
@ -146,8 +158,11 @@
|
|
|
|
- В образе `debian:bullseye-slim` не хватает `ICU`, необходимого для запуска полноценного `.NET` приложения. \
|
|
|
|
- В образе `debian:bullseye-slim` не хватает `ICU`, необходимого для запуска полноценного `.NET` приложения. \
|
|
|
|
Установите `libicu` в этом образе при сборке: `apt-get update && apt-get install libicu67`
|
|
|
|
Установите `libicu` в этом образе при сборке: `apt-get update && apt-get install libicu67`
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
##### 1.4 Проверка работоспособности контейнеризованного приложения
|
|
|
|
|
|
|
|
|
|
|
|
Пересоберите образ `todo-api`, и перезапустите контейнер `todo_api` на его основе, проверьте что всё работает.
|
|
|
|
Пересоберите образ `todo-api`, и перезапустите контейнер `todo_api` на его основе, проверьте что всё работает.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 2. Политики перезапуска и базовый мониторинг
|
|
|
|
### 2. Политики перезапуска и базовый мониторинг
|
|
|
|
|
|
|
|
|
|
|
|
1. Запустите `todo_ui`, `todo_api` и `todo_postgres` так, чтобы они перезапускались при ошибке или же \
|
|
|
|
1. Запустите `todo_ui`, `todo_api` и `todo_postgres` так, чтобы они перезапускались при ошибке или же \
|
|
|
|