Предисловие
Здравствуйте. Я являюсь новичком в сфере 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 и пропишем следующее по желанию. Данный код взят с официальной документации.
Кратко пробежимся по коду:
Скачиваем sdk образ, а также благодаря
workdir
назначаем папку source в контейнере как папку по умолчанию.Копируем при запуске контейнера файлы .sln и .csproj. и папку с проектом.
Назначаем по умолчанию папку с проектом.
Запускаем restore, чтобы засунуть в кэш неизменяемые файлы.
Публикуем приложение
Скачиваем образ с runtime etc.
Задаём переменные окружения по желанию.
Настраиваем папку по умолчанию.
Копируем папку с образа выставленного как build.
Запускаем кроссплатформенный файл.
Полезный ссылки
https://docs.docker.com/engine/reference/commandline/build/
https://www.baeldung.com/ops/dockerfile-run-cmd-entrypoint
Настроим файл docker-compose
Кратко пробежимся по коду
Укажем версию
Разберёмся со структурой каждого image:
image или build - указываем откуда будет строиться образ
volumes - синхронизация конфигурационных файлов, папок и подобных им
depends_on используется для запуска после того, как запустится зависимый контейнер
environment - переменные среды для настройки того или иного приложения внутри контейнера
ports - прокидываем внутренние порты докер контейнеров во внешние
networks - сеть по которой наши контейнеры будут общаться
ipam управление ip адреса
driver default - bridge
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.
Раннее мы запускали контейнеры с бд по порту 54332 и adminer по порту 8080. Зайдя по http://localhost:8080/
нам откроется панель для администрирования бд. Вводим данные в форму, после чего нас переводит в админ панель. Также мы можем администрировать бд благодаря плагину vs code Database или же благодаря pgAdmin.
Так как в бд пусто, продолжим. Создадим файл в папке app: context.cs и cat.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"