Бекенд на C# Web Api
Настройка docker compose файлов
Файлы docker-compose.yml используются для управления многоконтейнерными приложениями в Docker. Они описывают все сервисы, которые приложение использует (например, сервис приложения на C# WebApi и база данных), их настройки и зависимости в одном файле. Это упрощает развертывание и запуск приложений в Docker.
Перед настройкой конфига создадим в корневой папке приложения директорию docker, внутри которой будет еще одна директория bd. Пример можно посмотреть тут. Это понадобиться в дальнейшем.
Все compose файлы будут находиться также в корневой директории. Поскольку приложение может работать в разных средах, то нужно также определить несколько docker-compose файлов, каждый для своей среды.
Пример фала docker-compose-dev.yml, предназначенный для Development среды:
networks:
demo-network:
driver: bridge
services:
app_dev:
container_name: demo-webapi-dev
build:
context: DemoWebApi
dockerfile: Dockerfile
ports:
- "24:8080"
environment:
- DOTNET_ENVIRONMENT=Development
networks:
- demo-network
volumes:
- ./docker/logs:/app/logs
depends_on:
- postgres_db_dev
postgres_db_dev:
container_name: postgres-dev
image: postgres:latest
environment:
PGUSER: agava
POSTGRES_USER: agava
POSTGRES_PASSWORD: somestrongpassword
POSTGRES_DB: demo-webapi
PGDATA: /var/lib/postgresql/data/dbcase/
ports:
- "5432:5432"
networks:
- demo-network
volumes:
- ./docker/bd:/var/lib/postgresql/dataОбратим внимание на важные настройки:
app_dev build. Настройка context должна указывать на директорию, в которой находится Dockerfile, а настройка dockerfile на сам файл.
Порт сервиса app_dev. В примере выше приложение работает на 24 порту, следовательно при настройке https необходимо в конфиге nginx указывать 24 порт.
app_dev environment. Поскольку этот compose файл предназначен для Dev среды, то устанавливаем переменную окружения DOTNET_ENVIRONMENT в Development.
networks. Убедитесь что сервис app_dev и postgres_db_dev работают в одной сети.
app_dev volumes. Монтируем директорию
./docker/logs(находится на VPS) к директории/app/logs(находится внутри контейнера). Помним, что при настройке Serilog мы указали путь к файлам логов как/logs/log-.txt. По умолчанию, внутри контейнера приложение находится в директории app, значит логи внутри контейнера будут записываться в директорию /app/logs. И чтобы нам каждый раз не лезть внутрь контейнера и не смотреть там логи (+ чтобы логи не стирались при перезапуске контейнера), мы монтируем директорию из хоста.depends_on. Указываем что зависим от БД. Таким образом, сначала запустится сервис
postgres_db_dev, а затем сервисapp_dev.postgres_db_dev environment. Проверяем что имена и пароли совпадают с теми, что указаны в ConnetionString в appsettings.json.
postgres_db_dev volumes. Монтируем директорию ./docker/bd к данным базы данных. Таким образом, наша БД будет храниться в директории docker/bd.
Этот файл от части связан с файлом appsettings.Development.json. Проверьте правильность параметров в ConnectionString в appsettings.Development.json:
Host: должен быть как имя сервиса в compose файле (postgres_db_dev).
Port: должен быть такой же как в compose файле.
User id: должен быть такой же как в compose файле.
Password: должен быть такой же как в compose файле.
Пример файл для среды Production представлен ниже:
networks:
demo-network:
driver: bridge
services:
app:
container_name: demo-webapi
build:
context: DemoWebApi
dockerfile: Dockerfile
ports:
- "24:8080"
environment:
- DOTNET_ENVIRONMENT=Production
networks:
- demo-network
volumes:
- ./docker/logs:/app/logs
depends_on:
- postgres_db
postgres_db:
container_name: postgres
image: postgres:latest
environment:
PGUSER: agava
POSTGRES_USER: agava
POSTGRES_PASSWORD: somestrongpassword
POSTGRES_DB: demo-webapi
PGDATA: /var/lib/postgresql/data/dbcase/
ports:
- "5432:5432"
networks:
- demo-network
volumes:
- ./docker/bd:/var/lib/postgresql/dataОн не сильно, но все же отличается от файла docker-compose-dev.yml. Можно более детально сравнить compose файлы и файлы appsettings.json в этом примере.
Хабр — Изучаем Docker, часть 1: основы
Хабр — Основы контейнеризации (обзор Docker и Podman)
YourTodo — Docker-compose в действии: от базовой сборки до оптимизации приложений
Автор документа: Артём Ветик