Контейнеризация C# приложений с Docker: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему вашему C# проекту нужен Docker?

Представьте ситуацию: вы написали крутое C# приложение на своём ноутбуке с Windows 11, установили все библиотеки, настроили базу данных, и оно работает идеально. Но когда вы передаёте проект коллеге на macOS или заливаете на Linux-сервер, начинается ад: "у меня другая версия .NET", "а где SQL Server?", "у тебя в коде жёстко прописан путь к файлам"... Знакомо?

Именно здесь на помощь приходит контейнеризация C# приложений с Docker. Docker позволяет упаковать ваше приложение вместе со всеми зависимостями, настройками и даже операционной системой в лёгкий контейнер. И он будет работать одинаково везде: на вашем ПК, на сервере коллеги, в облаке AWS или Azure.

В этой статье мы разберём, как контейнеризировать C# приложения с Docker от А до Я. Вы узнаете, как создать Dockerfile для ASP.NET Core, как оптимизировать размер образа и как запустить всё это одной командой. Поехали!

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

Docker — это платформа для контейнеризации приложений. Контейнер — это изолированная среда, которая содержит ваше приложение и всё, что нужно для его работы: runtime, библиотеки, переменные окружения, конфиги. В отличие от виртуальных машин, контейнеры используют общее ядро ОС, поэтому они запускаются быстрее и занимают меньше места.

Для .NET разработчика Docker даёт несколько killer-фич:

  • Устранение проблемы "на моей машине работает" — контейнер гарантирует одинаковое окружение
  • Упрощение CI/CD — вы собираете образ один раз и используете его везде
  • Микроcервисная архитектура — каждый сервис на C# живёт в своём контейнере
  • Масштабирование — легко запустить 10 копий вашего API за пару секунд
  • Изоляция — зависимости одного проекта не конфликтуют с другим

Если вы ещё не используете контейнеризацию .NET приложений, самое время начать. И мы сделаем это прямо сейчас.

Подготовка: что нужно установить

Перед тем как приступить к контейнеризации C#, убедитесь, что у вас установлены:

  1. Docker Desktop — скачайте с официального сайта. Для Windows обязательно включите WSL 2 (подсказки будут при установке).
  2. .NET SDK 8.0 (или 7.0/9.0 — не принципиально) — скачайте с Microsoft.
  3. VS Code или Visual Studio 2022 — для удобной работы с кодом.

Проверьте установку командами в терминале:

docker --version
dotnet --version

Если обе команды вернули номер версии — всё готово к разработке Docker для .NET.

Создаём простое C# приложение для контейнеризации

Для демонстрации возьмём минимальный ASP.NET Core Web API. Создадим проект в пустой папке:

dotnet new webapi -n MyDockerApp
cd MyDockerApp

Откройте файл Program.cs и упростите его до такого вида (чтобы было наглядно):

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello from Dockerized C# App!");

app.Run();

Запустите локально, чтобы убедиться, что всё работает:

dotnet run

Перейдите в браузере на http://localhost:5000 (или порт, который выдаст консоль). Видите приветствие? Отлично. Теперь упакуем это приложение в Docker.

Пишем Dockerfile для C# приложения

Dockerfile — это инструкция по сборке образа. Для C# Docker пример используем многоступенчатую сборку (multi-stage build). Это стандарт индустрии: сначала компилируем в большом образе с SDK, а потом копируем готовый бинарник в минимальный образ с runtime.

Создайте файл Dockerfile (без расширения) в корне проекта и вставьте:

# Этап 1: Сборка
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyDockerApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

# Этап 2: Runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
EXPOSE 80
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyDockerApp.dll"]

Разберём этот Dockerfile C# построчно:

  • FROM ... AS build — базовый образ с .NET SDK для компиляции
  • WORKDIR /src — рабочая папка внутри контейнера
  • COPY ... — копируем только csproj, чтобы кешировать restore
  • RUN dotnet restore — восстанавливаем зависимости
  • COPY . . — копируем весь остальной код
  • RUN dotnet publish — компилируем в Release
  • FROM ... AS runtime — второй этап с минимальным ASP.NET runtime
  • EXPOSE 80 — открываем порт 80 внутри контейнера
  • COPY --from=build ... — копируем готовую сборку из первого этапа
  • ENTRYPOINT — команда запуска приложения

Собираем образ и запускаем контейнер

В терминале (из папки проекта) выполните:

docker build -t my-docker-app .
docker run -d -p 8080:80 --name my-app my-docker-app

Объяснение флагов:

  • -t my-docker-app — даём образу имя
  • -d — запуск в фоне
  • -p 8080:80 — пробрасываем порт 8080 хоста на порт 80 контейнера
  • --name my-app — имя контейнера

Теперь откройте http://localhost:8080. Видите "Hello from Dockerized C# App!"? Поздравляю, вы только что выполнили контейнеризацию C#

Блоги

Рекомендаций по книгам