kamulog

xamarin.formsのネタなど

Visual Studio for Mac で ASP.NET Core アプリの Docker 統合を使ってみる その2 MySQLコンテナ追加

前回の続きで、MySQL コンテナを追加するサンプルを書いてみました。

kamusoft.hatenablog.jp

プロジェクトのテンプレートは引き続き「ASP.NET Core Web アプリ」( RazorPages )を使います。

MySQL コンテナの追加

以下のようにソリューション以下にdbデータを保存する場所を作成しておきます。

  • DockerNetCore
    • volumes
      • db
    • DockerNetCore.sln
    • docker-compose.yml

docker-compose.ymlを以下のように変更します。

version: '3.4'

services:
  dockernetcore:
    container_name: myapp
    image: dockernetcore
    build:
      context: .
      dockerfile: DockerNetCore/Dockerfile
    volumes:
      - ./DockerNetCore/wwwroot:/app/wwwroot:rw
  mysql:
    image: mysql
    container_name: mydb
    environment:
        MYSQL_ROOT_PASSWORD: hogefuga
        MYSQL_DATABASE: test
    ports: 
      - 127.0.0.1:3456:3306
    volumes:
      - ./volumes/db:/var/lib/mysql:rw

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

MySqlConnector

公式の接続ライブラリを入れます。

f:id:kamusoft:20180410160811p:plain

Dapper

クエリ実行が素だと苦行なので軽量ORMの Dapper をここでは使います。(お好みのORMでOK)

f:id:kamusoft:20180410160829p:plain

.NET Core 側の設定

接続文字列は appsettings.Development.json に記述します。(本番用は appsettings.json に記述)

{
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information"
        }
    },
    "ConnectionString": "server=mydb;database=test;user id=root;password=hogefuga;"
}

同じdocker-compose内のコンテナであれば server は container_name で指定した名前 だけでアクセスできるようです。

MySQL に接続するコードを書く

startup.csに動作確認用のコードを書きます。

public void ConfigureServices(IServiceCollection services)
{
    var con = new MySqlConnection(Configuration["ConnectionString"]);
    con.Open();

    var createSql = @"
DROP TABLE IF EXISTS `names`;
CREATE TABLE `names` (
`id` INT unsigned NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL , 
PRIMARY KEY (`id`)
);
Insert Into names (name) Values ('hoge'); 
";
    con.Execute(createSql);

    var ret = con.Query("select * from names");

    con.Close();

    services.AddMvc();
}

appsettingsの項目へはこんな感じでアクセスできます。

実行

con.Close();の行でbreak pointを貼って実行してみます。

f:id:kamusoft:20180410160858p:plain

ちゃんとデータを取得できているので、接続してクエリを実行できていることが確認できました。

MySQLWorkbench で docker の MySQL に接続

docker-composeの記述の左側のポート番号で接続できます。

f:id:kamusoft:20180410160916p:plain

これでデータはいじり放題です。

まとめ

ASP.NET CoreコンテナとDBコンテナで個人的には必要十分なので、あとはコードに集中できて良い感じです。