はじめに
先日、Windows コンテナのプロセス分離モードで WCF サービスを動かすことに成功した。
お次はコンテナ外の 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 .
コンテナ外の SQL Server に接続
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 にイシューが存在している。
Microsoft 待ちか?
おわりに
コンテナ外の SQL Server に接続成功したから、
いよいよ本格的なアプリケーションを動かす実験に移る…と言いたいところだけど、
host.docker.internal
が使えないのではこの先の実験が大変になるな。
イシューが解決されるまで待つか、ホスト外に SQL Server を構築して実験を進めるか、
悩みどころ。