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

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

Важно знать, что если вы не планируете разворачивать Windows-контейнеры на Windows Server, то нужно использовать .NET Core или .NET 5 и новее. Старый .NET Framework не кросс-платформенный и не запустится в Linux-контейнерах.
Если Docker не установлен на вашей машине, установите Docker Desktop, чтобы получить CLI и удобный интерфейс. На Windows с WSL рекомендуется включить движок на базе WSL 2 для лучшей производительности.

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

Создайте в корне проекта файл
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
Для 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, не собирая внутри контейнера.
Мини-методология: быстрое руководство
- Выберите базовый образ Microsoft, соответствующий версии .NET вашего проекта.
- Используйте multi-stage Dockerfile: SDK для сборки, runtime для финального образа.
- Копируйте только необходимые файлы и публикуйте артефакты
dotnet publish -o out. - Настройте ENTRYPOINT и переменные окружения для конфигурации приложения.
- Тестируйте локально
docker run -pи проверяйте логиdocker logs. - В 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, соответствующие вашему проекту и политике обновлений.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента