はじめに
先日、Windows コンテナのプロセス分離モードで WCF サービスを動かすことに成功した。
tnakamura.hatenablog.com
お次はコンテナ外の SQL Server に接続できるか実験してみる。
これに成功したら、いよいよ本格的なアプリケーションを動かす実験に移れそう。
実験に使ったアプリケーション
今回使うのは、
SQL Server に接続してバージョンを取得する SQL を発行するだけの、
簡単なコンソールアプリケーション。
いろんな接続文字列を試しやすいように、
接続文字列を外部から受け取るようにしてみた。
using System;
using System.Data.SqlClient;
namespace SqlWCOW
{
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.Write("接続文字列を入力してください。:");
var connectionString = Console.ReadLine();
try
{
using (var connection = new SqlConnection(connectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = "SELECT @@VERSION";
var result = command.ExecuteScalar();
Console.WriteLine(result);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
Console.Write("終了しますか?[y/n]:");
var answer = Console.ReadLine();
if (answer.ToLower() == "y")
{
break;
}
}
}
}
}
Dockerfile
コンソールアプリケーションを動かすだけなので、
.NET Framework 4.8 ランタイムのコンテナイメージをベースに、
実験用コンテナイメージを作成。
こちらも、いろんな接続文字列で試したかったので、
ENTRYPOINT では cmd.exe を起動しておき、
cmd.exe から実験用アプリケーションを起動するようにしてみた。
FROM mcr.microsoft.com/dotnet/framework/runtime:4.8
WORKDIR /app
COPY ./SqlWCOW/bin/Release/ .
ENTRYPOINT ["cmd.exe"]
コンテナイメージ作成
> docker build -t tnakamura/sqlwcow:1.0 .
Docker コンテナを起動すると、コンテナ内で cmd.exe が立ち上がる。
> docker run --rm -it --isolation process --name sqlwcow tnakamura/sqlwcow:1.0
実験用アプリケーションを起動し、接続文字列を入力して実行。
今回は、ホスト上の SQL Server ではなく、Azure SQL Database に接続してみた。
接続成功。
余談
Docker のドキュメントによると、特殊な DNS 名 host.docker.internal
を使えばホストに接続できると書いてあったが、今回のコンテナイメージでは使えなかった。
この問題について GitHub にイシューが存在している。
github.com
Microsoft 待ちか?
おわりに
コンテナ外の SQL Server に接続成功したから、
いよいよ本格的なアプリケーションを動かす実験に移る…と言いたいところだけど、
host.docker.internal
が使えないのではこの先の実験が大変になるな。
イシューが解決されるまで待つか、ホスト外に SQL Server を構築して実験を進めるか、
悩みどころ。