Dockerfilesを使用してSQL Server Dockerコンテナを構成


ソフトウェアコンテナによって可能になるIT管理の可能性の1つは、SQL Serverなどのバックエンドデータベースシステムを展開するためにそれらを使用することです。 コンテナを使用すると、数秒で新しいデータベースインスタンスを導入することができ、開発と運用の機敏性と効率性が向上します。

以前は、Windows Server 2016のコンテナをインストールし、SQL Server 2016 Express Editionをコンテナ内で実行するために、Microsoftから事前に作成されたDockerイメージを使用する方法を示しました。 次に、SQL Server 2016 Standard Editionのコマンドラインインストールと組み合わせて、Windows Server Coreイメージを使用してカスタマイズされたSQL Serverイメージを構築する方法を示しました。 これにより、指定した機能で構成されたSQL Serverイメージを作成することができますが、これには時間がかかり、繰り返し操作でエラーが発生する可能性のある手動の手順が多数含まれています。

幸いにも、Dockerfileというツールは、コンテナを構築する作業を自動化します。 Dockerfilesを使用してSQL ServerのDockerコンテナ構成プロセスを合理化する方法については、こちらを参照してください。

Dockerfilesとは

Dockerfilesは使用するのがかなり簡単ですが、特定のコマンドにはある程度の知識が必要です。 本質的に、Dockerファイルは、Dockerイメージを作成するためのビルドコマンドを含むファイル拡張子のないテキストファイルです。 これらのイメージには、アプリケーションやSQL Serverなどのサービスを実行するために必要なソフトウェア層が含まれています。 DockerビルドコマンドをDockerfileとともに使用すると、Dockerfileの仕様に基づいたイメージが作成されます。

Dockerファイルは、Dockerイメージのコードコンパイラのように考えることができます。 Dockerfilesを使用すると、特定のイメージをすばやく簡単に再作成できます。 さらに、Dockerfileを変更することで、Dockerfileの初期仕様に基づいた派生的なイメージを作成することができます。

SQL ServerのDockerファイルの内部構造

図1は、SQL Server 2016 Expressイメージを構築するためのサンプルDockerfileを示しています。

 

図 1 SQL Serverコンテナを構築するためのDockerfile

Dockerfilesでは、コメント行は#文字で始まります。 コマンドを使用して、どのコマンドを実行するかを記述することができます。 この例では、画像で使用するDockerビルドコマンドとDocker実行コマンドを文書化することから始めました。 これらのコマンドについては、次のセクションで詳しく説明します。

そこから、FROMコマンドラインはコンテナの構築に使用されるベースイメージを識別します。 このケースでは、Windows Server CoreとSQL Server 2016 Express Editionのプリインストールされたインスタンスを含むMicrosoftのイメージです。 イメージがローカルリポジトリに存在しない場合は、オープンソースのDocker技術の背後にあるDocker Inc.によって運営されているリポジトリサイトであるDocker Hubからダウンロードされます。

イメージがインスタンス化されると、RUNステートメントを使用してコマンドを開始できます。 イメージがWindowsイメージの場合は、ここにあるように、コマンドシェルやPowerShellコマンドなどのWindowsコマンドの種類でなければなりません。 イメージがLinuxイメージの場合、コマンドは通常Bashコマンドになります。

図1では、PowerShellを使用して、SQLDataという名前のイメージにディレクトリを作成しています。 RUNステートメントのコマンドは、ホストシステムではなくコンテナイメージで実行されることに注意してください。 Dockerfileのこれらのコマンドはコンテナイメージで実行され、必要な属性を持つコンテナイメージを構築できます。

次に、2つのCOPYコマンドを使用して、Dockerfileのインストールディレクトリからイメージ内の新しく作成されたSQLDataディレクトリにファイルをコピーします。 最初のコマンドはサンプルAdventureWorks 2014データベースのAdventureWorks2014_Data.mdfファイルをコピーし、2行目はAdventureWorks2014_Log.ldfファイルをコピーします。 COPYコマンドには、*と?の両方を含めることができます。 ワイルドカード文字、? 単一の文字を置換するために使用されます。 たとえば、複数のMDFファイルとLDFファイルをc:¥ディレクトリにコピーする場合は、次のコマンドを使用できます。

COPY *.mdf C:/

COPY *.ldf C:/

Dockerファイルの例では、AdventureWorks2014データベースを構成するデータファイルとログファイルがコピーされます。 これにより、コンテナの起動時にAdventureWorks 2014データベースが自動的に添付されます。

最後にEXPOSEコマンドを使用して、ホストシステム上のTCPポート1433を開きます。 これがSQL Serverで使用されるデフォルトのポートです。 ポート1433は、SQL Serverで使用される既定のポートです。 ポート1433を開くと、SQL Server Management Studioやネットワーク接続されたシステムの他のアプリケーションや管理ツールを使用して、コンテナ内のSQL Serverインスタンスにリモートアクセスできます。

Dockerファイルを使ってイメージを構築する

この例は比較的単純ですが、実際のDockerfilesは、カスタマイズされたDockerコンテナ設定のための長いセットの仕様ではるかに広範囲になります。 Dockerビルドコマンドを使用して、これらの仕様を使用して新しいイメージを作成します。

 

Michael Oteyの質問:

Dockerfilesを使用してSQL Serverコンテナの展開を自動化していますか?

これを行うには、Dockerfileとその他のインストールファイル(AdventureWorks2014_Data.mdfファイルやAdventureWorks2014_Log.ldfファイルなど)を含むディレクトリに移動し、次のようなコマンドを実行します。

cd c:\sqlexpressbuild

docker build -t sqlexpress .

この例では、-t(またはtag)パラメータを使用して、新しいイメージの名前をsqlexpressにすることができます。 値は、現在のディレクトリがビルド操作に使用されることを示します。 新しいイメージが作成されたら、図2に示すように、Docker imagesコマンドを使用して使用可能なイメージを一覧表示できます。

 

図 2 使用可能なDockerイメージのローカルリポジトリへのリスト

この時点で、新しい標準化されたイメージに基づいて複数のコンテナをスピンアップする準備が整いました。 次のDocker Runコマンドでコンテナを起動できます。

docker run -d -e sa_password=9a55w0rd#1 -e ACCEPT_EULA=Y -e attach_dbs=”[{‘dbName’:’AdventureWorks2014′,’dbFiles’:[‘C:\\SQLData\\AdventureWorks2014_Data.mdf’,’C:\\SQLData\\AdventureWorks2014_Log.ldf’]}]” sqlexpress

このコマンドは、-dパラメータを使用して、コンテナがデタッチされていることを示します。つまり、バックグラウンドで実行され、UIはありません。コンテナの起動時にウィンドウが開きません。 代わりに、バックグラウンドプロセスとして実行されます。 -e sa_passwordパラメータには、組み込みのシステム管理者アカウントの初期パスワードを指定します。 ソフトウェア使用許諾契約に同意し、SQL Server Expressコンテナを開始するには、-e ACCEPT_EULA = Yパラメータが必要です。 -e attach_dbsパラメーターは、ファイルがDockerfileセットアッププロセスの一部としてコンテナにコピーされたAdventureWorks 2014データベースを接続するために使用されます。

Dockerfilesを使用すると、Dockerコンテナの構成とSQL Serverの展開プロセスを自動化し標準化するのに役立ちます。 開発者は、SQL Serverコンテナを使用することで、インストールや復元のプロセスが長引くのを待つことなく、データベースを使用して数秒で新しいSQL Serverインスタンスを実行できるため、優れています。

関連したトピックス

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください