Docker で SQL Server 2017 を走らせよう


Microsoft Japan Data Platform Tech Sales Team

阪本 真悟

 

はじめに

SQL Server 2017 から Windows 環境だけではなく、Linux 環境でも SQL Server のデータベースエンジンが動作するようになりました。これまで本ブログでも裏側のアーキテクチャや、Linux 環境での可用性構成(AlwaysOn 可用性グループ)、SQL Server に包含される ETL ツールである SQL Server Integration Services の Linux 対応についてご紹介してきました。

 

Linux 版 SQL Server は Docker コンテナにも対応しています。 SQL Server のような標準的なワークロードは Docker コンテナを活用することで高いポータビリティや柔軟性の恩恵を十分に得ることが出来ます。今回は Docker コンテナ環境での SQL Server 活用についてご紹介します。

まず Azure 上に Docker コンテナの環境を構築しましょう。 Azure の Marketplace に Docker on Ubuntu Server というインスタンスがありますので、これを使って Docker コンテナ環境を立ち上げることにします。

 

システム要件

まずシステム要件に合わせて VM のサイジングをして下さい。 Docker コンテナ環境のシステム要件は以下の通りです。このブログを書くために VM を作成したのですが、当初デフォルトの「Standard A1 (1core, 1.75GB メモリ)」サイズの VM を起動してしまい、SQL Server のステータスがUPしなくて困った状況に陥りました。システム要件の確認って大事ですね。

・Docker エンジン: 1.8 以降
・ディスクの空き容量:最低 4GB 必要
・メモリーのサイズ:最低 4GB 必要
・SQL on Linux 環境のシステム要件に従う

 

最後に SQL on Linux のシステム要件に従うことと書いていますので、SQL on Linux のシステム要件もチェックしておきます。

・メモリーサイズ: 3.25GB
・ファイルシステム: XFS or EXT4
・ディスクの空き容量: 6GB
・プロセッサースピード: 2GHz
・プロセッサーコア数: 2cores
・プロセッサータイプ: x64 互換のみ

準備

Marketplace では様々なサイズの VM が用意されていますので、上記要件に合わせて今回は DS2_V2 を選択しました。

 

サーバ構築が完了したら PuTTY などの SSH クライアントを使ってサーバにログインして、最初に SQL Server の Docker コンテナを Docker Hub からダウンロードします。以下の Bash コマンドで簡単に実行可能です。

 

docker pull microsoft/mssql-server-linux

 

 

※Azure の Marketplace で作成した環境では特に必要ありませんでしたが、設定によっては sudo コマンドなどで権限を与えてやる必要があるかもしれません。

 

Docker コンテナイメージの入手と実行

次に入手した SQL Server の Docker コンテナイメージを使って、それを走らせてみましょう。以下のコマンドを実行します。

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 
-d microsoft/mssql-server-linux

 

それぞれのパラメータの意味をご説明します。

 

-e 'ACCEPT_EULA=Y': SQL Server イメージを使うにあたって必要な利用許諾 (End-User Licensing Agreement) の回答をします。利用許諾の詳細を確認後、Y でご回答ください。

-e 'SA_PASSWORD=<YourStrong!Passw0rd>': <YourStrong!Passw0rd> の部分はパスワードポリシーに合わせて置き換えてご利用下さい。

-p 1433:1433: サーバの TCP ポート番号(1番目の数字)とコンテナの TCP ポート番号(2番目の数字)を紐づけています。今回はサーバとコンテナで同じ TCP ポート番号を使用しています。

microsoft/mssql-server-linux: SQL Server コンテナのイメージを指定します。バージョンを指定しない場合は常に最新版が使用されます。

 

上記コマンドで SQL Server Docker コンテナを走らせたら、以下のコマンドで確認してみましょう。

docker ps -a

 

改行が入ってしまって少し見にくいのですが、例のように STATUS が "UP" で表示されていれば問題なしです。STATUS が "Exited" で表示されてしまう場合はメモリサイズ、ディスクの空き容量などシステム要件を見直してみてください。特にメモリサイズ 1.75GB の Standard A1 で起動していないか確認してみて下さい(笑)

 

SQL Server on Docker への接続

SQL Server 2017 CTP 2.0 では SQL Server コマンドラインツールがコンテナイメージに含まれていますので使ってみましょう。以下のコマンドを使って Docker コンテナに接続します。

docker exec -it ‘Container ID’ “bash”

 

‘Container ID’ は先程の docker ps コマンドで確認したものを指定してください。

 

コンテナに接続した後は、コンテナイメージにあらかじめ含まれている sqlcmd ツールを使って操作をすることが出来るようになります。この時、sqlcmd コマンドに対してパスは通っていませんので、コマンドはフルパスで以下のように指定する必要があります。

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P '<YourPassword>'

 

SQL Server で SELECT 文を発行してデータベースの一覧表示をしてみます。

システム データベースの一覧が表示されることが確認出来ました。終了する場合は「exit」コマンドを入力して下さい。

 

コマンドラインで操作するのではなく、使い慣れた SQL Server Management Studio (SSMS) を使って Docker コンテナ上の SQL Server に接続することも出来ます。そのためには事前に Azure Portal から Endpoint の追加をして 1433 ポートへの通信を許可するように設定しましょう。SSH 通信は初期設定で 許可されているのですが、SSMS の通信はファイアウォールで遮断されてしまうからです。

 

Endpoint の追加後に SSMS を起動して、以下のように入力して Docker コンテナ上の SQL Server に接続します。
サーバ名とパスワードはお手元の環境設定に従って置き換えてご入力下さい。

 

見慣れた画面で管理出来るので安心しますね。

 

複数の SQL Server コンテナ起動

Docker コンテナを活用すると同一サーバ上に、簡単に複数の SQL Server を起動することが出来るようになります。以下のコマンドを使って複数の SQL Server を起動してみます。以下の例ではポート番号 1401 と 1402 に 紐づく 2 つの SQL Server Docker コンテナを起動してみました。

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' -p 1401:1433
 -d microsoft/mssql-server-linux
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' -p 1402:1433
 -d microsoft/mssql-server-linux

 

アッという間に複数の SQL Server コンテナが立ち上がりました。利用するときは IP アドレスとポート番号を指定することで個別環境に接続することが出来ます。複数の環境を立ち上げて管理するのは大変な作業になりがちですが、SQL Server on Docker コンテナを活用することでエンタープライズ領域での複数の環境でのデータベース管理が簡単に、かつ柔軟になります。

データの永続化

Docker コンテナの環境ではデータの永続化が課題になります。docker コンテナの開始・停止(docker stop・dcoker start)でデータが消えることはありませんが、コンテナ削除のコマンド(docker rm)を入力するとデータベースも含めたコンテナの全データが消えてしまいます。Docker の Data Volume を使ってデータベースを永続化しましょう。

 

Data Volume を使用する方法

Docker コンテナ上の Data Volume に ホストのディレクトリをマウントさせて起動するようにすると、個別のコンテナを削除したときも Data Volume のデータを残すことが出来ます。

 

次のコマンドで Docker コンテナをスタートさせます。

docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=<YourStrong!Passw0rd>' -p 1433:1433 -v <Data Volume>:/var/opt/mssql
 -d microsoft/mssql-server-linux

上記コマンドの -v 以降に<Data Volume> : と指定されている部分がポイントです。

<Data Volume> を指定しない方法ではコンテナを起動するタイミングでディレクトリを作成し Data Volume としてマウントしますが、コンテナを削除するとそのボリュームも一緒に削除されてしまいます。

<Data Volume> を明示的に指定するとマウントされるディレクトリはホスト上のファイルシステムに作成されるため、コンテナを削除しても影響を受けずデータは残りますし、/var/lib/docker 以下に隔離されているのでホストに干渉することもありません。
以下のコマンドで作成された Data Volume の情報を確認しましょう。作成した <Data Volume> = "mssql_data" が指定のマウントポイントにマウントされていることが確認出来ます。

docker volume ls

docker inspect <Data Volume>

 

 

永続化した Data Volume を削除したい場合は以下のコマンドで削除も可能です。

docker volume rm <Data Volume>

バックアップとリストア

バックアップとリストアは Linux 環境と同様に sqlcmd コマンドで実行することも出来ますし、SSMS で実行することも出来ます。

また以下のコマンドを使って Docker コンテナ環境上のファイルをコンテナ外にコピーすることも出来るのでファイル単位でのバックアップも可能です。

docker cp 'Container ID':/var/opt/mssql/data <host directory>

 

以下の例では Container ID 'c88794bfad57' の SQL Server データベース ファイルを ホストサーバの /tmp 以下にコピーしています。

まとめ

Docker コンテナ環境での SQL Server のセットアップから、運用フェーズで使える機能まで、順を追ってご紹介しました。

エンタープライズ領域でもコンテナ技術を適用する機会はどんどん増えてきています。特に開発環境を複数(大量に)準備しないといけないような場合、SQL Server on Docker を活用いただくことで、開発者とシステム管理者の双方にメリットがある柔軟な対応が可能なシステムを実現することが出来ます。

是非、SQL Server 2017 から提供されるこの新機能をご活用下さい。

 

関連記事

SQL Server on Linux って?(第 1 回目)

SQL Server on Linux って?(第 2 回目)

SQL Server on Linux でも AlwaysOn!

SQL Server Integration Services ( SSIS ) on Linux とは

Comments (0)

Skip to main content