DockerでC#(.Net)+MySQLの環境を構築してみる(Windows)

開発環境

  • OS:Windows11
  • Docker Desktopインストール済み
  • VSCodeインストール済み

アプリケーションの定義ファイル(YAML)作成

type nul > docker-compose.yml

下記の内容で編集。

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./app:/app
    working_dir: /app
    command: dotnet watch run --urls=http://0.0.0.0:5000
    ports:
      - "5000:5000"
    depends_on:
      db:
        condition: service_healthy

  db:
    image: mysql:8.4
    environment:
      MYSQL_ROOT_PASSWORD: odaneko
      MYSQL_DATABASE: odaneko
      MYSQL_USER: odaneko
      MYSQL_PASSWORD: odaneko
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-podaneko"]
      interval: 10s
      timeout: 5s
      retries: 10

volumes:
  mysql_data:

Dockerファイル作成

type nul > Dockerfile

下記の内容で編集。

FROM mcr.microsoft.com/dotnet/sdk:8.0

WORKDIR /app

CMD ["tail", "-f", "/dev/null"]

コンテナビルド・起動

docker compose up -d --build

プロジェクト作成

dotnet new webapi -n app

パッケージインストール

ディレクトリ移動。

cd app

パッケージインストール。

dotnet add package Dapper
dotnet add package MySqlConnector

ディレクトリを戻る。

cd ..

サンプルAPI作成

app\Program.csを下記の内容で編集。
APIを/db-testの1つ作成します。

using Dapper;
using MySqlConnector;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

app.UseSwagger();
app.UseSwaggerUI();

app.MapGet("/db-test", async () =>
{
    var connectionString = "Server=db;Port=3306;Database=odaneko;User=odaneko;Password=odaneko;";
    await using var connection = new MySqlConnector.MySqlConnection(connectionString);
    var result = await connection.QueryAsync("SELECT 1;");
    return result;
})
.WithName("db-test")
.WithOpenApi();

app.Run();

コンテナ再起動

コンテナ停止。

docker compose down

コンテナ起動。

docker compose up -d

SwaggerでAPIを実行

下記を開く。

http://localhost:5000/swagger

db-testを実行して1が返ってきたらOK。

以上になります。
お読み頂き、ありがとうございました。