В этом руководстве показано, как запустить приложение 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 и мультистеджинг
Подготовка проекта
На данном этапе, будеи считать, что мы работаем над проектом на нашем локальном компьютер и у нас есть проект, который мы клонируем из репозитория
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.
Проверяем, что в системе стоит 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 и в витоге у нас на этом порту запустится проект.