Как создавать многоконтейнерные приложения с помощью Docker Compose и C#
22 февраля 2023 г.Создание многоконтейнерного приложения может быть сложной задачей, но Docker Compose и C# могут сделать ее намного проще. В этой статье мы рассмотрим шаги по созданию многоконтейнерного приложения с помощью Docker Compose и C#.
Предпосылки
- Базовые знания концепций ООП.
* Любое знание языков программирования.
* Базовые знания докера
Итак, для начала, C#:
C# существует уже довольно давно, и он продолжает развиваться, приобретая все новые и новые функции. .medium.com
Цели обучения
- Как создать приложение с несколькими контейнерами с помощью Docker Compose и C#.
Начало работы
Шаг 1. Установите Docker и Docker Compose
Прежде чем мы начнем, убедитесь, что на вашем компьютере установлены Docker и Docker Compose. Docker — это платформа для разработки, доставки и запуска приложений с использованием контейнеризации, а Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker.
Вы можете загрузить Docker и Docker Compose с соответствующих веб-сайтов.
Шаг 2. Создайте новый каталог проекта
После установки Docker и Docker Compose создайте новый каталог для своего проекта и перейдите к нему с помощью терминала. В этом примере мы назовем наш проект «my-csharp-app».
mkdir my-csharp-app
cd my-csharp-app
Шаг 3. Создайте Dockerfile внешнего интерфейса
Далее мы создадим Dockerfile для нашего внешнего контейнера. Этот контейнер будет служить базовой HTML-страницей, которая вызывает наш серверный API.
Создайте новый файл с именем «Dockerfile.frontend» в каталоге вашего проекта и добавьте следующий код:
FROM nginx:alpine
COPY ./nginx.conf /etc/nginx/conf.d/default.conf
COPY ./wwwroot /usr/share/nginx/html
Этот Dockerfile использует официальный образ nginx: alpine в качестве основы и копирует наш пользовательский файл конфигурации nginx и HTML-файлы в соответствующие каталоги.
Шаг 4. Создайте внутренний файл Docker
Далее мы создадим Dockerfile для нашего серверного контейнера. Этот контейнер будет обслуживать простой C# API, который возвращает список пользователей в формате JSON.
Создайте новый файл с именем «Dockerfile.backend» в каталоге вашего проекта и добавьте следующий код:
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /app
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "MyCSharpApp.dll"]
Этот файл Dockerfile использует в качестве основы официальный SDK dotnet и копирует код нашего приложения в соответствующий каталог. Затем он восстанавливает зависимости, создает приложение и публикует его в выходном каталоге.
Наконец, он копирует выходные данные в соответствующий каталог в конечном контейнере и устанавливает точку входа для запуска приложения.
Шаг 5. Создайте файл Docker Compose
Теперь, когда у нас есть файлы Dockerfile, мы можем создать файл Docker Compose для определения нашего многоконтейнерного приложения.
Создайте новый файл с именем «docker-compose.yml» в каталоге вашего проекта и добавьте следующий код:
version: "3"
services:
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "8080:80"
depends_on:
- backend
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "5000:5000"
Этот файл Docker Compose определяет две службы: «frontend» и «backend». Служба «интерфейс» использует файл Dockerfile.frontend, который мы создали ранее, для создания своего образа. Он предоставляет порт 8080 на хост-компьютере, который сопоставляется с портом 80 в контейнере.
Это также зависит от "внутренней" службы, то есть она не запустится, пока не будет запущена "внутренняя" служба.
Служба «бэкэнд» использует файл Dockerfile.backend, который мы создали ранее, для создания своего образа. Он предоставляет порт 5000 как на узле, так и на контейнере и не зависит от других служб.
Шаг 6. Добавьте файлы конфигурации
Нам нужно добавить несколько файлов конфигурации, которые будут использоваться нашими контейнерами для связи.
Создайте новый каталог с именем «config» в каталоге вашего проекта и создайте в нем два файла: «appsettings.json» и «nginx.conf».
В файл appsettings.json добавьте следующий код:
{
"BackendBaseUrl": "http://backend:5000"
}
Этот файл конфигурации определяет переменную BackendBaseUrl, используемую нашим внешним контейнером для выполнения вызовов API к нашему внутреннему контейнеру.
В файл «nginx.conf» добавьте следующий код:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://frontend:80;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
}
Этот файл конфигурации определяет параметры обратного прокси-сервера NGINX, позволяя нашему внешнему контейнеру взаимодействовать с нашим внутренним контейнером.
Шаг 7. Напишите код приложения
Теперь, когда у нас есть контейнеры и файлы конфигурации, мы можем написать код приложения, которое будет работать внутри них.
Создайте новый каталог с именем «src» в каталоге вашего проекта и создайте в нем два файла: «Program.cs» и «UserController.cs».
В файл «Program.cs» добавьте следующий код:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace MyCSharpApp
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
Этот код устанавливает точку входа для нашего серверного контейнера и настраивает его для использования класса Startup, который мы определим на следующем шаге.
В файл «UserController.cs» добавьте следующий код:
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
namespace MyCSharpApp.Controllers
{
[ApiController]
[Route("[controller]")]
public class UserController : ControllerBase
{
private static readonly List<string> Users = new List<string> { "Alice", "Bob", "Charlie" };
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return Ok(Users);
}
}
}
Этот код определяет простой контроллер, который возвращает список пользователей при отправке HTTP-запроса GET на маршрут «/user».
Шаг 8. Напишите класс запуска
Создайте новый файл с именем Startup.cs в каталоге вашего проекта и добавьте следующий код:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace MyCSharpApp
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
Этот код устанавливает промежуточное ПО для нашего серверного контейнера и добавляет поддержку контроллеров.
Шаг 9. Создайте и запустите приложение
Теперь, когда мы написали код нашего приложения, мы можем создавать и запускать наши контейнеры с помощью Docker Compose.
В терминале перейдите в каталог проекта и выполните следующую команду:
docker-compose up
Эта команда создаст и запустит контейнеры, определенные в нашем файле «docker-compose.yml». После запуска контейнеров вы сможете получить доступ к приложению, перейдя по адресу "http://localhost" в веб-браузере.
Вы должны увидеть страницу со списком пользователей, который обслуживается нашим внутренним контейнером и демонстрируется нашим внешним контейнером.
Шаг 10. Остановите приложение
После тестирования вашего приложения вы можете остановить все работающие контейнеры, нажав "Ctrl-C" в своем терминале.
Это остановит и удалит все контейнеры, но не удалит созданные вами файлы данных или конфигурации.
Заключение
В этой статье показано, как создать приложение с несколькими контейнерами с помощью Docker Compose и C#.
Разбив наше приложение на более мелкие модульные контейнеры, мы можем улучшить масштабируемость и удобство обслуживания нашего приложения, а также упростить его разработку и развертывание.
Docker Compose предоставляет мощный набор инструментов для управления сложными приложениями на основе контейнеров, а C# предлагает надежную и гибкую платформу для создания веб-приложений.
Комбинируя эти две технологии, мы можем создавать современные облачные приложения, которые являются эффективными, надежными и простыми в управлении.
Следите за мной
Публикация C#, LinkedIn, Instagram, Twitter, Dev.to, Купи мнекофе
Также опубликовано здесь п
Оригинал