Деплой .NET Core проекта на Linux VPS

В этом руководстве показано, как запустить приложение ASP.NET Core в контейнерах Docker.

Представим, что вы закончили свой проект на Visual Studio на платформе .NET Core на своем Windows и вам теперь нужно залить проект на VPS — хостинг системой Linux и давайте разберемся, как это можно сделать.

В первую очередь, определимся со схемой DevOps и то, как мы будем запускать проекта и за основу, конечно же, возмомем Docker, которая должна быть установлена на VPS, но прежде сделаем это без Docker.

В общем говоря, данная статья преследует 3 цели:

  • понять, как в командной строке строится проект .NET Core
  • понять, как в ручном режиме задеплоить проект .NET Core на VPS Linux
  • понять, как автоматизировать процесс сборки и деплоя проекта на VPS Linux, используя Docker и мультистеджинг
Вы можете сами построить тестовый проект .NET Core или можете скачать готовый пример с официального репозитория по ссылке. Я же воспользуюсь последним вариантом.

Подготовка проекта

На данном этапе, будеи считать, что мы работаем над проектом на нашем локальном компьютер и у нас есть проект, который мы клонируем из репозитория

git clone https://github.com/dotnet/dotnet-docker

Запускаем приложение локально переходим в папку проекта по адресу dotnet-docker/samples/aspnetapp/aspnetapp выполняем следующую команду, чтобы создать и запустить приложение локально

cd dotnet-docker/samples/aspnetapp/aspnetapp
dotnet run

переходим по адресу http://localhost:5000 в браузере, чтобы убедиться в удачном запуске и работоспособности приложения, прежде чем мы запустим на VPS.

Деплой .NET Core на VPS в ручном режиме

Данный подход предполагает, что у вас в системе глобально установлена SDK для построения проекта .NET и среда исполнения скомпилированного проекта .NET.

В официальной статье описаны версии пакета SDK для .NET или среды выполнения, в которых можно установить версии различных дистрибутивов Linux, я же не буду на этом заострятся, надеюсь, что разберетесь.

Проверяем, что в системе стоит dotnet команда

dotnet --version

Перейдите в папку проекта по адресу dotnet-docker/samples/aspnetapp/aspnetapp

Запускаем команду релиза проекта dotnet

cd dotnet-docker/samples/aspnetapp/aspnetapp 
dotnet publish -c Release -o published

Аргументы команды:

  • publish -c Release -o — собераем приложение в режиме выпуска (по умолчанию используется режим отладки).
  • ресурсы в папке published

Запускаем приложение

dotnet published/aspnetapp.dll

На этом все и ваше приложение должно запускаться на определенном в настройках порту и это все работает

Деплой .NET Core на VPS в Docker

Разделим данный пункт на 2 части. В первой запустим скомпилированное приложение посредством Docker, а во втором скомпилируем и запустим полностью в Docker, не засоряя нашу систему Linux на VPS необходимыминструментами и рантаймами.

Публикация в Docker вручную

Чтобы использовать опубликованное вручную приложение в контейнере Docker, создайте новый файл Dockerfile и используйте сборку docker. команда для создания образа

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
COPY published/aspnetapp.dll ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

Чтобы увидеть новый образ, используйте команду

docker images

Построение и публикация в Docker автономно

Образец Dockerfile, который мы напишем, использует функцию многоэтапной сборки Docker для сборки и запуска в разных контейнерах. Контейнеры сборки и запуска создаются из образов, предоставленных Microsoft в Docker Hub.

Что нужно знать?

  • dotnet/sdk— мы используем этот образ для создания приложения. Образ содержит пакет SDK для .NET, в который входят средства командной строки (CLI). Образ оптимизирован для локальной разработки, отладки и модульного тестирования. Установленные инструменты для разработки и компиляции делают образ относительно большим.
  • dotnet/aspnet — мы используем этот образ для запуска приложения. Образ содержит среду выполнения ASP.NET Core и библиотеки и оптимизирован для запуска приложений в рабочей среде. Разработанный для быстрого развертывания и запуска приложения, образ относительно небольшой, поэтому производительность сети от реестра Docker до хоста Docker оптимизирована. В контейнер копируются только двоичные файлы и содержимое, необходимые для запуска приложения. Содержимое готово к запуску, что обеспечивает минимальное время docker runзапуска приложения. В модели Docker не требуется динамическая компиляция кода.

Вот видоизмененный файл Dockerfile и он должен быть на одном уровне с файлом решения aspnetapp.sln

# https://hub.docker.com/_/microsoft-dotnet
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY *.sln .
COPY aspnetapp/*.csproj ./aspnetapp/
RUN dotnet restore

# copy everything else and build app
COPY aspnetapp/. ./aspnetapp/
WORKDIR /source/aspnetapp
RUN dotnet publish -c release -o /app --no-restore

# final stage/image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app ./
ENTRYPOINT ["dotnet", "aspnetapp.dll"]

В предыдущем Dockerfile*.csproj файлы копируются и восстанавливаются как отдельные слои. Когда docker buildкоманда создает образ, она использует встроенный кэш. Если *.csprojфайлы не изменились с момента docker buildпоследнего dotnet restoreзапуска команды, повторный запуск команды не требуется. Вместо этого повторно используется встроенный кэш для соответствующего dotnet restoreслоя.

Чтобы запустить проект из данного Dockerfile нужно выполнить команду

docker run -it --rm -p 5000:80 --name aspnetcore_sample aspnetapp

Флаг -p задает перенаправление порта 80 из контейнера на порт 5000 во внешний мир VPS и в витоге у нас на этом порту запустится проект.

Пожалуйста, оцените материал

Деплой .NET Core проекта на Linux VPS