Visual Studio for Mac で ASP.NET Core アプリの Docker 統合を使ってみる その2 MySQLコンテナ追加
前回の続きで、MySQL コンテナを追加するサンプルを書いてみました。
プロジェクトのテンプレートは引き続き「ASP.NET Core Web アプリ」( RazorPages )を使います。
- MySQL コンテナの追加
- nuget パッケージインストール
- .NET Core 側の設定
- MySQL に接続するコードを書く
- 実行
- MySQLWorkbench で docker の MySQL に接続
- まとめ
MySQL コンテナの追加
以下のようにソリューション以下にdbデータを保存する場所を作成しておきます。
- DockerNetCore
- volumes
- db
- DockerNetCore.sln
- docker-compose.yml
- volumes
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
公式の接続ライブラリを入れます。
Dapper
クエリ実行が素だと苦行なので軽量ORMの Dapper をここでは使います。(お好みのORMでOK)
.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を貼って実行してみます。
ちゃんとデータを取得できているので、接続してクエリを実行できていることが確認できました。
MySQLWorkbench で docker の MySQL に接続
docker-composeの記述の左側のポート番号で接続できます。
これでデータはいじり放題です。
まとめ
ASP.NET CoreコンテナとDBコンテナで個人的には必要十分なので、あとはコードに集中できて良い感じです。