Как создавать многоконтейнерные приложения с помощью Docker Compose и C#

Как создавать многоконтейнерные приложения с помощью Docker Compose и C#

22 февраля 2023 г.

Создание многоконтейнерного приложения может быть сложной задачей, но Docker Compose и C# могут сделать ее намного проще. В этой статье мы рассмотрим шаги по созданию многоконтейнерного приложения с помощью Docker Compose и C#.

Предпосылки

  • Базовые знания концепций ООП.

* Любое знание языков программирования.

* Базовые знания докера

Итак, для начала, 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, Купи мнекофе


Также опубликовано здесь п


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE