Новые возможности контейнеров для .NET 8
В этой статье описываются новые функции в контейнерах для .NET 8.
Образы контейнеров
Следующие изменения были внесены в образы контейнеров .NET для .NET 8:
- не корневого пользователя
- Debian 12
- Образы Ubuntu с чёткими деталями
- Создание образов контейнеров для различных платформ
- ASP.NET составные изображения
Пользователь, отличный от корневого пользователя
Изображения включают пользователя non-root
. Этот пользователь делает изображения совместимыми с non-root
. Чтобы запустить как non-root
, добавьте следующую строку в конце файла Dockerfile (или аналогичную инструкцию в манифестах Kubernetes):
USER app
.NET 8 добавляет переменную окружения для UID пользователя non-root
, который равен 1654. Эта переменная среды полезна для теста Kubernetes runAsNonRoot
, который требует, чтобы пользователь контейнера был задан с помощью UID, а не по имени. В этом dockerfile показан пример использования.
Порт по умолчанию также изменился с порта 80
на 8080
. Для поддержки этого изменения новая переменная среды ASPNETCORE_HTTP_PORTS
доступна, чтобы упростить изменение портов. Переменная принимает список портов, который проще, чем формат, необходимый для ASPNETCORE_URLS
. Если вы измените порт обратно на порт 80
с помощью одной из этих переменных, вы не сможете работать как non-root
.
Дополнительные сведения см. в разделе Порт по умолчанию ASP.NET Core изменен с 80 на 8080 и Новый пользователь 'app' без прав суперпользователя в образах Linux.
Debian 12
Теперь образы контейнеров используют Debian 12 (Bookworm). Debian — это дистрибутив Linux по умолчанию в образах контейнеров .NET.
Дополнительные сведения см. в разделе Образы контейнеров Debian, обновленные до Debian 12.
Отточенные образы Ubuntu
Доступны образы Chiseled Ubuntu для .NET 8. Хиселированные изображения имеют уменьшенную атакуемую поверхность, потому что они ультра-маленькие, не имеют диспетчера пакетов или оболочки, и non-root
. Этот тип образа предназначен для разработчиков, которые хотят воспользоваться преимуществами аппаратных вычислений.
Хиселированные изображения по умолчанию не поддерживают глобализацию. предоставляются изображения extra
, в том числе пакеты icu
и tzdata
.
Дополнительные сведения о глобализации и контейнерах см. в тестовом приложении по глобализации .
Создание мультиплатформенных образов контейнеров
Docker поддерживает использование и создание многоплатформенных образов , которые работают в нескольких средах. .NET 8 представляет новый шаблон, позволяющий смешивать и сопоставлять архитектуры с создаваемыми образами .NET. Например, если вы используете macOS и хотите нацелиться на облачную службу x64 в Azure, вы можете создать образ с помощью переключателя --platform
следующим образом:
docker build --pull -t app --platform linux/amd64
Пакет SDK для .NET теперь поддерживает значения $TARGETARCH
и аргумент -a
при восстановлении. В следующем фрагменте кода показан пример:
RUN dotnet restore -a $TARGETARCH
# Copy everything else and build app.
COPY aspnetapp/. .
RUN dotnet publish -a $TARGETARCH --self-contained false --no-restore -o /app
Дополнительные сведения см. в записи блога Улучшение поддержки многоплатформенных контейнеров.
композитные изображения ASP.NET
В рамках усилий по повышению производительности контейнеризации новые ASP.NET образы Docker доступны с составной версией среды выполнения. Этот композит создается путем компиляции нескольких сборок CIL в один готовый выходной двоичный файл (R2R). Так как эти сборки внедрены в один образ, jitting занимает меньше времени, а производительность запуска приложений улучшается. Другое большое преимущество составного по сравнению с обычным ASP.NET образа заключается в том, что составные образы имеют меньший размер на диске.
Есть предостережение, о котором стоит помнить. Поскольку композиты включают в себя несколько сборок, объединенных в единую, они обладают более тесной связью версий. Приложения не могут использовать пользовательские версии платформы или ASP.NET двоичные файлы.
Композитные изображения доступны для платформ Alpine Linux, Ubuntu ("jammy") Chiseled и Mariner Distroless из репозитория mcr.microsoft.com/dotnet/aspnet
. Теги перечислены с суффиксом -composite
на странице ASP.NET Docker .
Публикация контейнеров
- Настройки созданных изображений по умолчанию
- Производительность и совместимость
- проверки подлинности
- Публиковать в архив tar.gz
Созданные образы по умолчанию
dotnet publish
может создавать образы контейнеров. По умолчанию он создает non-root
образы, что помогает приложениям оставаться безопасными по умолчанию. Измените этот параметр по умолчанию в любое время, установив свойство ContainerUser
, например, с помощью root
.
Теперь тег выходного контейнера по умолчанию latest
. Это значение по умолчанию соответствует другим инструментам в пространстве контейнеров и упрощает использование контейнеров во внутренних циклах разработки.
Производительность и совместимость
.NET 8 улучшила производительность при отправке контейнеров в удаленные реестры, особенно в реестры Azure. Ускорение достигается за счет отправки слоев в одной операции и использования более надежного механизма сегментирования для реестров, которые не поддерживают атомарные загрузки.
Эти улучшения также означают, что поддерживаются дополнительные реестры: Harbor, Artifactory, Quay.io и Podman.
Аутентификация
.NET 8 добавляет поддержку аутентификации обмена токенами OAuth (Управляемое удостоверение Azure) при отправке контейнеров в реестры. Эта поддержка означает, что теперь вы можете отправлять реестры, такие как Реестр контейнеров Azure, без ошибок проверки подлинности. В следующих командах показан пример потока публикации:
> az acr login -n <your registry name>
> dotnet publish -r linux-x64 -p PublishProfile=DefaultContainer
Дополнительные сведения о контейнеризации приложений .NET см. в разделе Контейнеризация приложения .NET с помощью dotnet publish.
Публикация в архиве tar.gz
Начиная с .NET 8, вы можете создать контейнер непосредственно в качестве архива tar.gz. Эта функция полезна, если рабочий процесс не прост и требует, чтобы вы, например, запустите средство сканирования по изображениям, прежде чем отправлять их. После создания архива его можно переместить, проверить или загрузить его в локальную цепочку инструментов Docker.
Чтобы опубликовать в архиве, добавьте свойство ContainerArchiveOutputPath
в команду dotnet publish
, например:
dotnet publish \
-p PublishProfile=DefaultContainer \
-p ContainerArchiveOutputPath=./images/sdk-container-demo.tar.gz
Можно указать имя папки или путь с определенным именем файла.