Разворачиваем и заворачиваем в docker проект ASP.NET core на Ubuntu в связке с PostgreSQL

Предисловие

Здравствуйте. Я являюсь новичком в сфере it. Идея написать данную статью мне пришла отчасти оттого, что, по моим наблюдениям, тема про пару dotnet и Linux не освещена в больших объёмах (скорее всего из-за ненадобности), но как новичок новичку хотел бы рассказать как можно справиться с этой задачей, что и будем делать вместе.

Задача

Развернуть проект ASP.NET core с шаблоном webapi на Ubuntu в связке с PostgreSQL и положить всё в docker контейнеры, запустив их через docker-compose.

Начало

Для начала нам стоило бы скачать необходимый базис для работы с ASP.NET core и docker, docker-compose в среде Linux под нужный дистрибутив (в моём случае Ubuntu). На это время тратить не буду, так как на просторах интернета данные темы подробно описаны.

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

После того как всё скачали и проверили на работоспособность: docker -v & docker-compose -v & dotnet --info, можем приступать к работе.

Глава 1

fb37af2441dc6779d8b849b38d8ec57d.png

Создадим директрию и вложим в неё файл docker-compose.yml и папку. Я работаю в VS code и данная история выглядит следующим образом.

Итоговый результат выглядит так

Итоговый результат выглядит так

После чего откроем терминал и перейдём по пути в нашу вложенную папку (в моём случае это cd ./app). С помощью команды dotnet -h мы можем просмотреть какие возможности нам доступны. Так как нам нужно развернуть проект, мы выбираем new. Чтобы проверить какие аргументы возможно прописать, прописываем dotnet new -h, после чего видим, чтобы просмотреть какие шаблоны у нас имеются, можем

прописать dotnet new list. Определившись с шаблоном прописываем dotnet new (в моём случае: webapi) --no-https -controllers. Заметим, что все аргументы мы можем просмотреть, прописав -h, что касается не только dotnet.

Запустим приложение и проверим работоспособность. Напишем команду dotnet run и в терминале выведется следующее.Мы можем проверить работоспособность, зайдя по url, но продолжим дальше.

Глава 2

698d0e6ead82e7586d6f53be433775f2.png

Создадим в главной директории папку docker. Создадим в этой папке следующее: dotnet, nginx, bd. Папка dotnet для докерфайлов и других составляющих, bd для того, чтобы синхронизировать файлы из докер контейнера с данной папкой, nginx для синхронизации конфигураций.

3203339515d3d43383d896818b9371a1.png

Перейдём к dockerfile в папке dotnet и пропишем следующее по желанию. Данный код взят с официальной документации.

Кратко пробежимся по коду:

  1. Скачиваем sdk образ, а также благодаря workdir назначаем папку source в контейнере как папку по умолчанию.

  2. Копируем при запуске контейнера файлы .sln и .csproj. и папку с проектом.

  3. Назначаем по умолчанию папку с проектом.

  4. Запускаем restore, чтобы засунуть в кэш неизменяемые файлы.

  5. Публикуем приложение

  6. Скачиваем образ с runtime etc.

  7. Задаём переменные окружения по желанию.

  8. Настраиваем папку по умолчанию.

  9. Копируем папку с образа выставленного как build.

  10. Запускаем кроссплатформенный файл.

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

Настроим файл docker-compose

517c7d7bcb6fa288804c532a6011b877.pngКратко пробежимся по коду

  1. Укажем версию

  2. Разберёмся со структурой каждого image:

    1. image или build — указываем откуда будет строиться образ

    2. volumes — синхронизация конфигурационных файлов, папок и подобных им

    3. depends_on используется для запуска после того, как запустится зависимый контейнер

    4. environment — переменные среды для настройки того или иного приложения внутри контейнера

    5. ports — прокидываем внутренние порты докер контейнеров во внешние

    6. networks — сеть по которой наши контейнеры будут общаться

      1. ipam управление ip адреса

      2. driver default — bridge

      3. config subnet и gateway— маска подсети и сетевой шлюз

Но всё это можно заменить указав сеть bridge

Настроем файл nginx

57e8a86714f78fd06f21d5dc3cc95d46.pngКратко пробежимся по кодуПолезный ссылки

Глава 3

После проделанной работы отправимся в нашу папку с проектом cd app и в терминале укажем следующий код dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 8.0.0этот пакет служит для взаимодействия с PostgreSQL. Также нам необходимо установить инструмент для работы с EF core, и в этом нам поможет команда dotnet tool install --global dotnet-ef.

Просмотреть установленный пакет мы можем благодаря команде dotnet list package

Просмотреть установленный пакет мы можем благодаря команде dotnet list package

Просмотреть установленные инструменты мы можем благодаря команде dotnet tool list -g

Просмотреть установленные инструменты мы можем благодаря команде dotnet tool list -g

Раннее мы запускали контейнеры с бд по порту 54332 и adminer по порту 8080. Зайдя по http://localhost:8080/ нам откроется панель для администрирования бд. Вводим данные в форму, после чего нас переводит в админ панель. Также мы можем администрировать бд благодаря плагину vs code Database или же благодаря pgAdmin.

cat.cs

cat.cs

Так как в бд пусто, продолжим. Создадим файл в папке app: context.cs и cat.cs и заполним следующим кодом

context.cs

context.cs

Так как мы не указали host в параметрах контейнера PostgreSQL, то он нам доступен по дефолтному хосту localhost. Теперь мы можем сделать миграцию. Инициализируем миграции с помощью dotnet ef migrations add initia и dotnet ef database update.Теперь зайдя в нашу среду администрирования, мы увидим, что добавилась таблица Cats.

c33e543c0c281a7e3db3a35eea551eed.png

Теперь мы можем обращаться в controllers к бд.

Останавливаем контейнеры, удаляем контейнер с проектом. Перезапустим контейнеры, так как мы только упаковываем готовое приложение. По адресу http://api.prop.loc/Cat мы можем сделать get запрос на создание и получение котика. Чтобы каждый раз не удалять и не перезапускать контейнеры, при желании мы можем прописать volumes, но это другая история.

Вот так просто и разворачивается проект ASP.NET core в среде Ubuntu в связке с PostgreSQL и дальнейшей контейнеризацией на сервере nginx + kestrel, и котиками.

Благодарю, что дочитали данную статью

Частые ошибки

EF core error

You must install .NET to run this application.App: /home/danis/.dotnet/tools/dotnet-ef Architecture: x64 App host version: 8.0.0 .NET location: Not foundLearn more: https://aka.ms/dotnet/app-launch-failedDownload the .NET runtime: https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=linux-x64&os=ubuntu.22.04&apphost_version=8.0.0

Данную ошибку можно решить, прописав export DOTNET_ROOT=/usr/share/dotnet(путь до репозитория dotnet с sdk и runtime (для каждого индивидуально)) Также эту перменную можно установить при каждом входе в систему (отдельная тема).

В случае, если вы указали хост в nginx и по какой-то причине у вас не открывается страница
d8cc1b81cb2204dd95bc8ec7a3a85856.png

То скорее всего нужно разрешить для этого хоста доступ через sudo nano /etc/hosts

В случае, если вы делаете docker-compose up и docker выдаёт ошибку по типу: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get «http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json? all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dproject%22%3Atrue%7D%7D»: dial unix /var/run/docker.sock: connect: permission denied

Скорее всего вам нужно прописать перед docker «sudo»

© Habrahabr.ru