Гид по технологиям

Dockerизация .NET приложений

• 5 min read • DevOps • Обновлено 28 Nov 2025
Dockerизация .NET приложений
Dockerизация .NET приложений

C#

Быстрые ссылки

  • Dockerizing .NET

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

Dockerизация .NET

Microsoft предоставляет готовые базовые образы для запуска .NET-приложений. Вам не нужно вручную устанавливать .NET Runtime или SDK внутри контейнера, достаточно расширить официальный образ Microsoft для нужной версии .NET.

Microsoft .NET Core

Важно знать, что если вы не планируете разворачивать Windows-контейнеры на Windows Server, то нужно использовать .NET Core или .NET 5 и новее. Старый .NET Framework не кросс-платформенный и не запустится в Linux-контейнерах.

Если Docker не установлен на вашей машине, установите Docker Desktop, чтобы получить CLI и удобный интерфейс. На Windows с WSL рекомендуется включить движок на базе WSL 2 для лучшей производительности.

If using WSL on Windows, enable the WSL 2-based engine

Для примера создадим новое ASP.NET API приложение. Общая процедура применима к любому приложению: Docker собирает проект при билде контейнера и запускает приложение через команду entrypoint.

Create a new ASP.NET API application

Создайте в корне проекта файл

Dockerfile

и вставьте следующую конфигурацию:

FROM mcr.microsoft.com/dotnet/core/sdk AS build-env

WORKDIR /app

# Copy csproj and restore

COPY *.csproj ./

RUN dotnet restore

# Copy everything else and build

COPY . ./

RUN dotnet publish -o out

# Build runtime image

FROM mcr.microsoft.com/dotnet/core/runtime

WORKDIR /app

COPY --from=build-env /app/out .

ENTRYPOINT ["dotnet", "DockerTest.dll"]

Этот Dockerfile использует образ .NET Core SDK для сборки. Он копирует файл проекта (.csproj), выполняет restore, затем копирует всё остальное и собирает приложение. После сборки создаётся второй образ на базе .NET Runtime, в который копируются артефакты сборки.

ENTRYPOINT запускает приложение командой dotnet DockerTest.dll. Для вашего проекта имя сборки и параметры могут отличаться — при необходимости замените их на корректные.

Вы можете протестировать запуск контейнера с помощью docker container run, передав ID или имя собранного образа:

docker container run containerid

Run your container with docker container run, passing it in the ID of the build container

Для ASP.NET-приложения обычно нужно пробросить порты, сопоставив порт хоста и контейнера:

docker run -p 80:80 containerid

Ниже — дополнительные рекомендации, альтернативы и чек-листы для продакшен-готового контейнера.

Когда этот подход не подходит

  • Если приложение использует несовместимые только для Windows библиотеки — тогда Linux-контейнеры не подойдут. Нужно либо Windows-контейнер, либо миграция к кросс-платформенным зависимостям.
  • Если требуется минимальный размер образа и вы не можете использовать многоступенчатую сборку, рассмотрите специализированные минимальные базовые образы (например, образ на основе Alpine), но учтите возможные проблемы с совместимостью нативных библиотек.
  • Для сложных CI/CD пайплайнов с множеством шагов сборки может быть выгоднее разделять стадии сборки и артефакты с использованием реестра образов.

Альтернативные подходы

  • Использовать multi-stage Dockerfile, как в примере, чтобы уменьшить финальный размер образа.
  • Вместо образов mcr.microsoft.com/dotnet/core/* использовать образы mcr.microsoft.com/dotnet/aspnet и mcr.microsoft.com/dotnet/sdk для современных версий .NET (последние теги отличаются по версиям).
  • Для локальной разработки применять Docker Compose с настройкой томов для горячей перезагрузки кода.
  • В CI использовать ссылку на сборку артефактов (например, dotnet publish на CI) и загружать готовые артефакты в image, не собирая внутри контейнера.

Мини-методология: быстрое руководство

  1. Выберите базовый образ Microsoft, соответствующий версии .NET вашего проекта.
  2. Используйте multi-stage Dockerfile: SDK для сборки, runtime для финального образа.
  3. Копируйте только необходимые файлы и публикуйте артефакты dotnet publish -o out.
  4. Настройте ENTRYPOINT и переменные окружения для конфигурации приложения.
  5. Тестируйте локально docker run -p и проверяйте логи docker logs.
  6. В CI собирайте образ и пушьте в реестр (Docker Hub, ACR, ECR и т. п.).

Чек-лист для сборки и деплоя

  • В Dockerfile используется multi-stage сборка
  • Файлы конфигурации и секреты не копируются в образ
  • ENV переменные и секреты передаются через runtime, не через образ
  • [ ] Порт проброшен корректно (-p host:container)
  • Логи и метрики собираются наружу (stdout/stderr)
  • Сканирование образа на уязвимости пройдено
  • Тесты сборки проходят в CI

Важно: храните секреты вне образа (например, в Kubernetes Secrets, HashiCorp Vault или CI/CD переменных).

Советы по безопасности и харднингу

  • Не запускайте приложение в контейнере от root-пользователя по умолчанию. Используйте непустого пользователя.
  • Минимизируйте слои и размер финального образа.
  • Обновляйте базовые образы регулярно и применяйте сканирование уязвимостей.
  • Ограничивайте привилегии контейнера и сетевые правила на уровне оркестратора.

Примеры тестовых случаев и критерии приёмки

  • Контейнер успешно собирается без ошибок на CI.
  • Приложение отвечает на ожидаемый HTTP-эндпоинт после запуска с -p.
  • Логи содержат строки уровня INFO/ERROR в ожидаемом формате.
  • При отсутствии внешних зависимостей приложение стартует и завершает инициализацию.

Короткий глоссарий

  • Dockerfile — текстовый файл с инструкциями для сборки образа.
  • multi-stage — многослойная сборка: отдельные стадии для компиляции и финального рантайма.
  • ENTRYPOINT — команда, запускаемая при старте контейнера.

Миграция и совместимость

  • Для миграции с .NET Framework на .NET Core/5+ оцените зависимости от Windows API и сторонних библиотек.
  • Для выполнения на Linux замените Windows-only зависимости или расположите сервис в Windows-контейнере.

Итог

Docker упрощает переносимость .NET-приложений и их развертывание в изолированной среде. Используйте официальные образы Microsoft и multi-stage Dockerfile, чтобы получать компактные и воспроизводимые образы. Применяйте чек-листы безопасности и тесты в CI, чтобы обеспечить стабильность и защищённость в продакшене.

Примечание: используйте имена образов и версии .NET, соответствующие вашему проекту и политике обновлений.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро