はじめに
.NETアプリケーションを作るのにSQLServerを利用しようと思ったが、
クライアント環境を汚さないように、勉強も兼ねてDockerで稼働させることにした。
今回はSQLServer Developer 2017を稼働させる。
Docker体験も兼ねてるので、Docker知ってる人なら当たり前・・という内容も含まれているので注意。
なお、このページの内容は下記ページに基づいています。
https://hub.docker.com/r/microsoft/mssql-server-windows-express/
環境
- Windows10 Professional
- SQL Server Management Studio 17.3(クライアント環境を汚さないようにと思うが、やはりSSMSは欲しい)
- Docker CommunityEdition 17.09.1-ce-win42 (14687)
DockerForWindowsの導入
本題ではないが簡単に記載。Windows10の場合、Professional以上のエディションが必要。
- Windowsの機能の有効化より、「Hyper-V」、「コンテナー」をインストール
- Docker for windowsをインストールする。(https://docs.docker.com/docker-for-windows/install/)
- DockerをWindowsContainerモードにしておく(タスクトレイを右クリックしてSwitch to Windows containers...)
- PowerShellタブ補完のインストール(任意)
- PowerShellで>Install-Module posh-dockerする
- "Import-Module posh-docker"をprofile.ps1に追加する。
imageの取得
サイズも大きいので、一旦imageを取得しておく。サイズは11.6GBとなかなか大きい。
expressの場合はmicrosoft/mssql-server-windows-expressをpullする。
docker pull microsoft/mssql-server-windows-developer
コンテナの起動
環境変数として下記を指定する。
ACCEPT_EULA・・・利用許諾契約に同意するかどうか。Yで指定。
sa_password・・・管理ユーザー(saユーザー)のパスワードを指定。複雑性の要件あり。
attach_dbs (任意)・・・dbName(DB名)、dbFiles(mdf,ldfファイル)を指定。
docker run -d -p 1433:1433 -e sa_password=P@ssw0rd -e ACCEPT_EULA=Y microsoft/mssql-server-windows-developer
オプションの意味は下記。
d・・・デタッチドモード。ルートプロセスが終了したらコンテナも終了する。
p・・・[ホスト側ポート]:[コンテナ側ポート]でポートフォワードする。
e・・・[変数名]=[値]で環境変数を指定。
SQLServerインスタンスは通常1433ポートを利用する。
この段階で、localhost:1433にsaユーザーで接続可能となる。
コンテナの停止・終了
コンテナの停止は、docker stop。(32fad42ed443は"docker ps -a"で確認可能なコンテナID)
数分かかかる。
docker stop 32fad42ed443
コンテナの再開は、
docker start 32fad42ed443
停止、再開であればデータは保持される。
コンテナの削除は停止後に、
docker rm 32fad42ed443
コンテナ内のデータが消えるため、データを永続化したい場合は注意。
データの永続化
システムDBなどは、コンテナ側の下記フォルダに保存される。
C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA
新しいDBを作成する場合もコンテナ内のフォルダパスを指定する。
ただしこのままでは、上記の通りコンテナ削除時にデータが消えてしまう。
永続化するには、ホスト側のフォルダをvオプションでコンテナにマウントする。
下記のようにすると、ホスト側のc:/Users/hoge/work/docker-mssql/dataをコンテナ側のC:/DATAにマウントする。C:\Data以下にmdf,ldfファイルを作成することでコンテナを削除してもデータが消えなくなる。
(Windowsのボリューム指定方法はぐぐると色々書き方があったが、私の環境では下記の書き方で通った。)
docker run -d -p 1433:1433 -e sa_password=P@ssw0rd -e ACCEPT_EULA=Y -v "c:/Users/hoge/work/docker-mssql/data:C:/DATA" microsoft/mssql-server-windows-developer
作成したmdf,ldfファイルを読み込んだ状態でコンテナを起動するには、下記のようにattach_dbs環境変数を指定する。
docker run -d -p 1433:1433 -e sa_password=P@ssw0rd -e ACCEPT_EULA=Y -e attach_dbs="[{'dbname':'testDB','dbFiles':['C:\\DATA\\testdb.mdf','C:\\DATA\\testdb_log.ldf']}]" -v "c:/Users/hoge/work/docker-mssql/data:C:/DATA" microsoft/mssql-server-windows-developer
デフォルトのC:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATAにマウントできたらいいなぁと思ったが、思ったようにマウントできず断念。半角スペースの前を\でエスケープしたらコンテナ起動はできたが、何か違う場所をマウントしてしまっているのか、DB作成してもファイルができなかった。
もともとシステムDBのファイルなどあるので、だめなのかも??よくわからず。