Введение в .NET и Docker

Контейнеры являются одним из самых популярных способов развертывания и размещения облачных приложений с такими инструментами, как Docker, Kubernetes и Podman. Многие разработчики выбирают контейнеры, так как просто упаковать приложение со своими зависимостями и получить это приложение для надежного запуска на любом узле контейнера. Существует обширная поддержка использования .NET с контейнерами.

Docker предоставляет отличный обзор контейнеров. Docker Desktop: Community Edition — это хорошее средство для использования контейнеров на классическом компьютере разработчика.

Образы .NET

Официальные образы контейнеров .NET публикуются в Реестр артефактов Microsoft и доступны для обнаружения в Центре Docker. Существуют образы среды выполнения для рабочей среды и образов пакета SDK для создания кода для Linux (Alpine, Debian, Ubuntu, Mariner) и Windows. Дополнительные сведения см. в разделе образов контейнеров .NET.

Образы .NET регулярно обновляются при публикации нового исправления .NET или при обновлении базового образа операционной системы.

Образы контейнеров с хиселом — это образы контейнеров Ubuntu с минимальным набором компонентов, необходимых для среды выполнения .NET. Эти образы имеют ~100 МБ меньше обычных образов Ubuntu и имеют меньше CVEs, так как они имеют меньше компонентов. В частности, они не содержат оболочку или диспетчер пакетов, что значительно улучшает свой профиль безопасности. Они также включают не корневого пользователя и настраиваются с включенным пользователем.

Сборка образов контейнеров

Вы можете создать образ контейнера с помощью Dockerfile или использовать пакет SDK для .NET для создания образа. Примеры для создания образов см. в разделе dotnet/dotnet-docker и dotnet/sdk-container-builds.

В следующем примере показано создание и запуск образа контейнера в нескольких быстрых шагах (поддерживается .NET 8 и .NET 7.0.300).

$ dotnet new webapp -o webapp
$ cd webapp/
$ dotnet publish -t:PublishContainer
MSBuild version 17.8.3+195e7f5a3 for .NET
  Determining projects to restore...
  All projects are up-to-date for restore.
  webapp -> /home/rich/webapp/bin/Release/net8.0/webapp.dll
  webapp -> /home/rich/webapp/bin/Release/net8.0/publish/
  Building image 'webapp' with tags 'latest' on top of base image 'mcr.microsoft.com/dotnet/aspnet:8.0'.
  Pushed image 'webapp:latest' to local registry via 'docker'.
$ docker run --rm -d -p 8000:8080 webapp
7c7ad33409e52ddd3a9d330902acdd49845ca4575e39a6494952b642e584016e
$ curl -s http://localhost:8000 | grep ASP.NET
    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
$ docker ps
CONTAINER ID   IMAGE     COMMAND               CREATED              STATUS              PORTS                                       NAMES
7c7ad33409e5   webapp    "dotnet webapp.dll"   About a minute ago   Up About a minute   0.0.0.0:8000->8080/tcp, :::8000->8080/tcp   jovial_shtern
$ docker kill 7c7ad33409e5

docker init — это новый вариант для разработчиков, желающих использовать Dockerfiles.

Порты

Сопоставление портов является ключевой частью использования контейнеров. Порты должны быть опубликованы вне контейнера, чтобы реагировать на внешние веб-запросы. ASP.NET образы контейнеров Core изменились в .NET 8 , чтобы прослушивать порт 8080по умолчанию. .NET 6 и 7 прослушивают порт 80.

В предыдущем примере с docker runпортом узла сопоставляется порт 80008080контейнера. Kubernetes работает аналогичным образом.

Переменные ASPNETCORE_HTTP_PORTSсреды и ASPNETCORE_URLS среды ASPNETCORE_HTTPS_PORTSможно использовать для настройки этого поведения.

Пользователи

Начиная с .NET 8 все изображения включают не appкорневого пользователя. По умолчанию с помощью этого пользователя настроены сконфигурированные изображения. Приложение публикации как функция контейнера .NET (показанная в разделе "Сборка образов контейнеров") также настраивает образы с включенным пользователем по умолчанию. Во всех других сценариях app пользователь может быть настроен вручную, например с USERпомощью инструкции Dockerfile . Если образ настроен и app команды должны выполняться как root, USER инструкции можно использовать для задания пользователю root.

Оставаясь в курсе

Новости, связанные с контейнерами, публикуются в обсуждениях dotnet/dotnet-docker и в категорию "контейнеры" блога .NET.

Службы Azure;

Контейнеры поддерживаются различными службами Azure. Создать образ Docker для приложения и развернуть его можно в одной из следующих служб:

  • Служба Azure Kubernetes (AKS)
    Масштабирование и оркестрация контейнеров Windows и Linux с помощью Kubernetes.

  • Служба приложений Azure
    Развертывание веб-приложений или API с помощью контейнеров в среде PaaS.

  • Приложения контейнеров Azure
    Запустите рабочие нагрузки контейнеров без управления серверами, оркестрацией или инфраструктурой и используйте встроенную поддержку Dapr и KEDA для обеспечения наблюдаемости и масштабирования до нуля.

  • Экземпляры контейнеров Azure
    Создайте отдельные контейнеры в облаке без служб управления более высокого уровня.

  • Пакетная служба Azure
    Выполнение повторяющихся вычислительных заданий с помощью контейнеров.

  • Azure Service Fabric
    Отмена, смена и модернизация приложений .NET в микрослужбы с помощью контейнеров Windows и Linux.

  • Реестр контейнеров Azure;
    Хранение образов контейнеров и управление ими во всех типах развертываний Azure.

Следующие шаги