Бекенд на C# Web Api

To Kaiten

Настройка docker compose файлов

Назначение

Файлы docker-compose.yml используются для управления многоконтейнерными приложениями в Docker. Они описывают все сервисы, которые приложение использует (например, сервис приложения на C# WebApi и база данных), их настройки и зависимости в одном файле. Это упрощает развертывание и запуск приложений в Docker.

Настройка docker-compose.yml файла

Перед настройкой конфига создадим в корневой папке приложения директорию docker, внутри которой будет еще одна директория bd. Пример можно посмотреть тут. Это понадобиться в дальнейшем.

Все compose файлы будут находиться также в корневой директории. Поскольку приложение может работать в разных средах, то нужно также определить несколько docker-compose файлов, каждый для своей среды.

docker-compose-dev.yml

Пример фала 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 файле.

docker-compose-prod.yml

Пример файл для среды 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 в действии: от базовой сборки до оптимизации приложений


Автор документа: Артём Ветик