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

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

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

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

КУРСЫ ПО IT ОТ RolarapSchool

События и курсы на rolarap

Для решения подобных проблем запуска приложения .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, я придерживаюсь следующей структуры:

src — исходный код проекта

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

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

Учебник. Контейнеризация приложения .NET Core

Образы Docker для ASP.NET Core

Страница образами .NET

Руководство по настройке .NET и SQL Server

Документация по Flyway: https://flywaydb.org/documentation/, https://flywaydb.org/documentation/

Net

#docker

#sql

#IT #программирование #it новости

Поделиться

Оценить

Также рекомендуем

Обложка: Основные команды SQL

Основные команды SQL, которые должен знать каждый программист

вопросы на собеседовании sql

27 распространённых вопросов по SQL с собеседований и ответы на них

15 полезных команд PostgreSQL

Оконные функции в SQL — что это и зачем они нужны

Наш основной канал в Telegram: @rolarap