0
Обложка: Как настроить работу .NET приложения, SQL Server, Flyway-миграций с помощью Docker, Docker Compose

Как настроить работу .NET приложения, SQL Server, Flyway-миграций с помощью Docker, Docker Compose

Егор
Егор
Разработчик Noveo

Зачастую разработчикам необходимо устанавливать и настраивать разные приложения, технологии, сервисы для локальной разработки проектов. Когда проект один и вы работаете, например, с одной версией .NET, или если все разработчики работают на Windows, то какие-либо проблемы с настройкой проекта вряд ли появятся.

Но что, если вам периодически нужно переключаться между разными версиями Java, PHP, Node.js, да еще и у одного разработчика установлен Linux, а у другого Windows? Конечно, можно писать инструкции по установке и настройке, но это не решает проблему изолированности вашей операционной системы от среды приложения.

После удаления уже установленной версии .NET, SQL Server могут остаться какие-либо файлы конфигурации, которые могут привести к ошибке запуска другой установленной версии приложения.

Для решения подобных проблем запуска приложения .NET, SQL Server на разных средах можно использовать Docker, Docker Compose.

1. Установка Docker, Docker Compose

Для установки Docker нам нужно на странице Install Docker Engine открыть руководство по необходимой ОС.

Для установки Docker Compose — на странице Install Docker Сompose также открыть руководство по необходимой ОС.

Проверяем, что Docker и Docker Compose работает, выполняя команды в консоли:

$ docker-compose -v
docker-compose version 1.28.6, build unknown
$ docker-compose --version
docker-compose version 1.28.6, build unknown

2. Создание структуры директорий проекта

Для своих проектов, где используется Docker, я придерживаюсь следующей структуры:

  1. src — исходный код проекта
  2. docker:
  • api — директория с файлами конфигурации, файлом docker для сборки образа .NET приложения,
  • db — директория с файлами конфигурации, файлом docker для сборки образа SQL Server, миграциями,

docker-compose.yml — файл с настройками запуска контейнеров.

3. Формирование Docker-файлов для .NET, SQL Server

3.1. Настройка образа .NET Docker

Для работы .NET-приложения создадим файл Dockerfile в директории проекта с путем docker/api/Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:3.1-focal AS base
WORKDIR /app
EXPOSE 5000

ENV ASPNETCORE_URLS=http://+:5000
ENV ASPNETCORE_ENVIRONMENT Development

# Creates a non-root user with an explicit UID and adds permission to access the /app folder
# For more info, please refer to https://aka.ms/vscode-docker-dotnet-configure-containers
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser

FROM mcr.microsoft.com/dotnet/sdk:3.1-focal AS build
WORKDIR /src
COPY ["./src/app.csproj", "/src"]
COPY ["./nuget.config", "./"]
RUN dotnet restore "app.csproj"
COPY ./src .

WORKDIR "/src"
RUN dotnet build "app.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "app.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "app.dll"]

3.2. Настройка образа SQL Server Docker

Для работы SQL Server создадим файл Dockerfile в директории проекта с путем docker/db/Dockerfile, содержимое которого:

FROM flyway/flyway:8.0.4-alpine

COPY ./*.sql /flyway/sql/
COPY ./flyway.conf /flyway/conf/

ENTRYPOINT [ "flyway", "migrate" ]

3.3. создадим файл конфигурации /docker/db/migrations/flyway.conf с содержимым:

flyway.url=jdbc:sqlserver://mssql-db
flyway.user=sa
flyway.password=Your_password123
flyway.mixed=true

3.3.1. создадим файл миграции в директории /docker/db/migrations/V1__DatabaseCreation.sql с содержимым:

USE [master]
GO

CREATE DATABASE [TEST]
GO

USE [TEST]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE SCHEMA data AUTHORIZATION dbo;
GO

CREATE TABLE [dbo].[test](
 [Id] [int] NOT NULL,
 [Name] [varchar](30) NOT NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[test] ([Id], [Name])
 VALUES (1, 'User1')
GO

Подробнее о работе с миграциями с помощью Flyway можно почитать тут:

— https://flywaydb.org/documentation/,

— https://flywaydb.org/documentation/

4.Создание файла docker-compose.yml

Итак, нам осталось создать только файл docker-compose.yml, чтобы описать в нем все сервисы:

  • db — сервис для работы MS SQL Server,
  • db-migration — сервис для работы с Flyway-миграциями,
  • api — сервис для работы с .NET-приложением.

Создадим файл docker-compose.yml в директории проекта с путем docker/docker-copmose.yml и содержимым:

version: "3.4"
services:
   api:
       build:
           context: "../"
           dockerfile: ./docker/api/Dockerfile
       container_name: "api"
       ports:
           - "5000-5001:5000-5001"
       depends_on:
           - db
           - db-migrations
       networks:
           - app-network
   db:
       build:
           context: "./db"
       container_name: "db"
       environment:
           SA_PASSWORD: "Your_password123"
           ACCEPT_EULA: "Y"
       ports:
           - "1433:1433"
       networks:
           - app-network
   db-migrations:
       build:
           context: "./db/migrations"
       container_name: "db-migrations"
       volumes:
           - ./db/migrations:/flyway/sql
       networks:
           - app-network
       depends_on:
           - db
networks:
   app-network:
       driver: bridge

5. Запуск приложения

Для запуска нам нужно запустить Docker-контейнеры при помощи команды docker-compose. Из директории проекта выполняем в терминале команду:

cd ./docker && docker-compose up -d --force-recreate --build

после чего наше приложение должно открыться в браузере по url: http://localhost:5000

К SQL Server мы можем подключиться с помощью команды:

sqlcmd -S db -d TEST -G -U sa

указав пароль Your_password123

Полезные ссылки

  1. Учебник. Контейнеризация приложения .NET Core
  2. Образы Docker для ASP.NET Core
  3. Страница образами .NET
  4. Руководство по настройке .NET и SQL Server
  5. Документация по Flyway: https://flywaydb.org/documentation/, https://flywaydb.org/documentation/