Docker and C#: Containerizing .NET Applications from Scratch

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

Docker и C#: контейнеризация .NET приложений



В современной разработке программного обеспечения контейнеризация стала стандартом де-факто для создания, тестирования и развертывания приложений. Docker позволяет упаковать ваше C# приложение вместе со всеми его зависимостями в изолированную среду — контейнер. Это гарантирует, что приложение будет работать одинаково на любой машине: от ноутбука разработчика до production-сервера в облаке.



В этой статье мы подробно разберем, как контейнеризировать .NET приложения с помощью Docker. Вы узнаете, как создавать эффективные Dockerfile, использовать многоступенчатую сборку, работать с docker-compose для многоконтейнерных приложений и следовать лучшим практикам.



Что такое Docker и зачем он нужен C# разработчику?



Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер — это легковесный, автономный, исполняемый пакет, который содержит все необходимое для работы приложения: код, среду выполнения (runtime), системные инструменты, библиотеки и настройки.



Для C# разработчика Docker дает следующие преимущества:

  • Изоляция окружения — больше не нужно настраивать окружение на каждой машине. Все зависимости фиксируются в образе.
  • Унификация — приложение работает одинаково на Windows, Linux и macOS.
  • Масштабируемость — легко запускать несколько экземпляров приложения для обработки нагрузки.
  • CI/CD интеграция — контейнеры идеально подходят для автоматических пайплайнов сборки и развертывания.
  • Микросервисная архитектура — каждый сервис можно упаковать в отдельный контейнер.


Важно отметить, что .NET Core (и более новые .NET 5/6/7/8) являются кроссплатформенными и отлично работают в Linux-контейнерах, которые являются стандартом для Docker. .NET Framework приложения требуют Windows-контейнеров, что накладывает определенные ограничения.



Создание Dockerfile для .NET приложения



Основной артефакт для контейнеризации — это файл Dockerfile. Он содержит инструкции для сборки образа вашего приложения. Рассмотрим пример для типичного ASP.NET Core Web API.



Создайте файл Dockerfile в корне вашего проекта:



# Этап 1: Сборка приложенияFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /src

# Копируем файл проекта и восстанавливаем зависимостиCOPY ["MyApp/MyApp.csproj", "MyApp/"]RUN dotnet restore "MyApp/MyApp.csproj"

# Копируем весь исходный код и собираем приложениеCOPY . .WORKDIR "/src/MyApp"RUN dotnet build "MyApp.csproj" -c Release -o /app/build

# Этап 2: Публикация приложенияFROM build AS publishRUN dotnet publish "MyApp.csproj" -c Release -o /app/publish /p:UseAppHost=false

# Этап 3: Финальный образ для запускаFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS finalWORKDIR /appEXPOSE 80EXPOSE 443

# Копируем опубликованные файлы из этапа publishCOPY --from=publish /app/publish .

# Устанавливаем пользователя без прав root для безопасностиUSER app

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


Разбор инструкций:

  • FROM ... AS build — используем SDK-образ для сборки. Это "строительный" этап.
  • WORKDIR — задает рабочую директорию.
  • COPY — копирует файлы из хост-системы в образ.
  • RUN dotnet restore — восстанавливает NuGet-пакеты.
  • RUN dotnet build — компилирует проект.
  • FROM ... AS publish — второй этап для публикации (часто объединяют с build).
  • FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final — финальный образ, содержащий только ASP.NET Core runtime. Он намного легче SDK-образа.
  • COPY --from=

Blogs

Book Recommendations