Разворачиваем и заворачиваем в 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). На это время тратить не буду, так как на просторах интернета данные темы подробно описаны.

Полезный ссылки
  • https://timeweb.cloud/tutorials/docker/kak-ustanovit-docker-na-ubuntu-22-04

  • https://timeweb.cloud/tutorials/docker/kak-ustanovit-docker-na-ubuntu-22-04

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

Глава 1

Создадим директрию и вложим в неё файл 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

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

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

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

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

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

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

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

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

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

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

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

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

Полезный ссылки
  • https://docs.docker.com/engine/reference/commandline/build/

  • https://www.baeldung.com/ops/dockerfile-run-cmd-entrypoint

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

Кратко пробежимся по коду
  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

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

Полезный ссылки
  • https://nginx.org/en/docs/http/ngx_http_upstream_module.html

  • https://learn.microsoft.com/ru-ru/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-8.0&tabs=linux-ubuntu

Глава 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.

Теперь мы можем обращаться в 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 и по какой-то причине у вас не открывается страница

То скорее всего нужно разрешить для этого хоста доступ через 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"

Источник: https://habr.com/ru/articles/780952/


Интересные статьи

Интересные статьи

Несколько дней назад я решал задачу подключения Yandex GPT, и главной сложностью там было освоение Yandex Cloud Console. В остальном API - вылитая LLaMa 2.С Google Gemini история иная. Документация к...
❓Как проектировать системы, которые будут толерантными для различного вида отказов и ошибок?Что такое отказоустойчивость и стабильность?Под отказоустойчивостью будем понимать свойство системы, которое...
Любой крупный проект начинался с пары серверов. Cначала был один DB-сервер, потом к нему добавились слейвы, чтобы масштабировать чтение. И тут — стоп! Мастер один, а слейвов много; ес...
Я ничего не понимаю в клавиатурах, в моей жизни был только Genius, Logitech и клава от мака. Я хочу любить клавиатуры, но они меня бесят. Не могу научиться печать вслепую, по кнопкам ...
Вы задавались когда-нибудь вопросом, как в играх наподобие Super Meat Boy реализована функция реплея? Один из способов её реализации — выполнять ввод точно так же, как это делал игрок, что, в с...