Почему вашему 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#, убедитесь, что у вас установлены:
- Docker Desktop — скачайте с официального сайта. Для Windows обязательно включите WSL 2 (подсказки будут при установке).
- .NET SDK 8.0 (или 7.0/9.0 — не принципиально) — скачайте с Microsoft.
- 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, чтобы кешировать restoreRUN dotnet restore— восстанавливаем зависимостиCOPY . .— копируем весь остальной кодRUN dotnet publish— компилируем в ReleaseFROM ... AS runtime— второй этап с минимальным ASP.NET runtimeEXPOSE 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#