Windows コンテナのプロセス分離モードでコンテナ外の SQL Server に接続する実験

はじめに

先日、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 .

f:id:griefworker:20190717105315p:plain

コンテナ外の SQL Server に接続

Docker コンテナを起動すると、コンテナ内で cmd.exe が立ち上がる。

> docker run --rm -it --isolation process --name sqlwcow tnakamura/sqlwcow:1.0

f:id:griefworker:20190717105419p:plain

実験用アプリケーションを起動し、接続文字列を入力して実行。 今回は、ホスト上の SQL Server ではなく、Azure SQL Database に接続してみた。

f:id:griefworker:20190717105432p:plain

接続成功。

余談

Docker のドキュメントによると、特殊な DNShost.docker.internal を使えばホストに接続できると書いてあったが、今回のコンテナイメージでは使えなかった。 この問題について GitHub にイシューが存在している。

github.com

Microsoft 待ちか?

おわりに

コンテナ外の SQL Server に接続成功したから、 いよいよ本格的なアプリケーションを動かす実験に移る…と言いたいところだけど、 host.docker.internal が使えないのではこの先の実験が大変になるな。 イシューが解決されるまで待つか、ホスト外に SQL Server を構築して実験を進めるか、 悩みどころ。