SQL Server Linux コンテナーの構成およびカスタマイズ
適用対象: SQL Server - Linux
この記事では、Docker を使用して SQL Server Linux コンテナーを構成およびカスタマイズする方法について説明します。 データを保持したり、コンテナーとの間でファイルを移動したり、既定の設定を変更したりできます。
ヒント
sqlcmd (Go) を使用して、コンテナー内に SQL Server の新しいインスタンスを開発用に作成できます。 詳細については、「SQL Server コンテナーの作成とクエリ」を参照してください。
カスタマイズしたコンテナーを作成する
独自の Dockerfile を作成して、カスタマイズされた SQL Server コンテナーを構築できます。 詳しくは、SQL Server とノード アプリケーションを組み合わせたデモをご覧ください。 独自の Dockerfile を作成する場合は、フォアグラウンド プロセスに注意してください。このプロセスによってコンテナーの有効期間が制御されるためです。 それが存在する場合、コンテナーはシャットダウンされます。 たとえば、スクリプトを実行して SQL Server を開始する場合は、SQL Server プロセスが一番右のコマンドであることを確認します。 その他のコマンドはすべてバックグラウンドで実行されます。 次のコマンドは、Dockerfile 内でのこのことを示しています。
/usr/src/app/do-my-sql-commands.sh & /opt/mssql/bin/sqlservr
前の例のコマンドを元に戻した場合、do-my-sql-commands.sh スクリプトの完了時にコンテナーはシャットダウンされます。
データを保持する
docker stop
と docker start
を使用してコンテナーを再起動しても、SQL Server の構成変更とデータベース ファイルはコンテナーに保持されています。 一方、docker rm
を使用してコンテナーを削除すると、SQL Server とデータベースを含め、コンテナーの内容がすべて削除されます。 次のセクションでは、関連付けられているコンテナーが削除された場合でも、データ ボリュームを使用してデータベース ファイルを保持する方法について説明します。
重要
SQL Server の場合、Docker 内でのデータの永続化について理解することが重要です。 このセクションの説明に加えて、Docker コンテナー内でデータを管理する方法については、Docker のドキュメントをご覧ください。
ホスト ディレクトリをデータ ボリュームとしてマウントする
1 つ目のオプションは、ホスト上のディレクトリをコンテナー内のデータ ボリュームとしてマウントすることです。 それを行うには、docker run
が任意のパスである場合、-v <host directory>:/var/opt/mssql
フラグを指定して <host directory>
コマンドを使用します。 たとえば、Windows 上の C:\SQL
や Linux 上の ~/sqlvolumes
などです。 これにより、コンテナーの実行間でデータを復元できます。
Note
SQL Server 2019 (15.x) 以降のバージョンのコンテナーは自動的に非ルートとして起動するのに対し、SQL Server 2017 (14.x) のコンテナーは既定でルートとして起動します。 SQL Server コンテナーを非ルートとして実行する方法の詳細については、「SQL Server Linux コンテナーをセキュリティで保護する」を参照してください。
重要
SA_PASSWORD
環境変数は非推奨です。 代わりに MSSQL_SA_PASSWORD
を使用してください
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v <host directory>/data:/var/opt/mssql/data \
-v <host directory>/log:/var/opt/mssql/log \
-v <host directory>/secrets:/var/opt/mssql/secrets \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v <host directory>/data:/var/opt/mssql/data `
-v <host directory>/log:/var/opt/mssql/log `
-v <host directory>/secrets:/var/opt/mssql/secrets `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v <host directory>/data:/var/opt/mssql/data ^
-v <host directory>/log:/var/opt/mssql/log ^
-v <host directory>/secrets:/var/opt/mssql/secrets ^
-d mcr.microsoft.com/mssql/server:2022-latest
この手法では、Docker の外部にあるホスト上のファイルを共有して表示することもできます。
データ ボリューム コンテナーを使用する
2 つ目のオプションは、データ ボリューム コンテナーを使用することです。 -v
パラメーターを使用してホスト ディレクトリではなくボリューム名を指定して、データ ボリューム コンテナーを作成できます。 次の例では、sqlvolume
という名前の共有データ ボリュームを作成します。
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 \
-v sqlvolume:/var/opt/mssql \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 `
-v sqlvolume:/var/opt/mssql `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 ^
-v sqlvolume:/var/opt/mssql ^
-d mcr.microsoft.com/mssql/server:2022-latest
Note
実行コマンド内でデータ ボリュームを暗黙的に作成するこの手法は、以前のバージョンの Docker では機能しません。 その場合は、Docker のドキュメント、「データ ボリューム コンテナーの作成とマウント」に概説されている明示的な手順を使用します。
このコンテナーを停止して削除しても、データ ボリュームは保持されます。 docker volume ls
コマンドを使用して表示できます。
docker volume ls
その後、同じボリューム名を持つ別のコンテナーを作成すると、新しいコンテナーでは、ボリュームに含まれているのと同じ SQL Server データが使用されます。
データ ボリューム コンテナーを削除するには、docker volume rm
コマンドを使用します。
警告
データ ボリューム コンテナーを削除すると、コンテナー内のすべての SQL Server データがすべて完全に削除されます。
バックアップと復元
これらのコンテナー手法に加えて、標準の SQL Server バックアップと復元の手法を使用することもできます。 バックアップ ファイルを使用して、データを保護したり、別の SQL Server インスタンスにデータを移動したりすることができます。 詳細については、「Linux 上での SQL Server データベースのバックアップと復元」を参照してください。
警告
バックアップを作成する場合は、必ずコンテナーの外部でバックアップ ファイルを作成またはコピーしてください。 そうしないと、コンテナーが削除された場合に、バックアップ ファイルも削除されます。
コンテナーでの VDI のバックアップと復元を有効にする
SQL Server 2019 (15.x) の CU15、SQL Server 2017 (14.x) の CU28 から、SQL Server コンテナーのデプロイで仮想デバイス インターフェイス (VDI) のバックアップと復元操作がサポートされるようになりました。 次の手順に従って、SQL Server コンテナーに対する VDI ベースのバックアップまたは復元を有効にします。
SQL Server コンテナーをデプロイする場合、
--shm-size
オプションを使います。 はじめに、次のコマンドに示すように、サイズを 1 GB に設定します。docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Mystr0ngP@ssw0rd!" \ --shm-size 1g \ -p 1433:1433 \ --name sql19 \ --hostname sql19 \ -d mcr.microsoft.com/mssql/server:2019-latest
--shm-size
オプションを使うと、コンテナー内の共有メモリ ディレクトリ (/dev/shm
) のサイズを設定できます。既定では 64 MB に設定されています。 この既定の共有メモリ サイズでは、VDI バックアップのサポートには不十分です。 SQL Server コンテナーをデプロイし、VDI バックアップをサポートする場合、これを 1 GB 以上に設定することをお勧めします。コンテナー内で
mssql.conf
の新しいパラメーターmemory.enablecontainersharedmemory
を有効にする必要もあります。mssql.conf
は、「データを保持する」セクションで説明した-v
オプションを使用してコンテナーのデプロイ時にマウントするか、コンテナーをデプロイした後に、コンテナー内のmssql.conf
を手動で更新することでマウントすることができます。memory.enablecontainersharedmemory
設定がtrue
に設定されたサンプルmssql.conf
ファイルを次に示します。[memory] enablecontainersharedmemory = true
コンテナーからファイルをコピーする
コンテナーからファイルをコピーするには、次のコマンドを使用します。
docker cp <Container ID>:<Container path> <host path>
コンテナー ID は、docker ps -a
コマンドの実行で取得できます。
例:
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog /tmp/errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
docker cp d6b75213ef80:/var/opt/mssql/log/errorlog C:\Temp\errorlog
コンテナーにファイルをコピーする
コンテナーにファイルをコピーするには、次のコマンドを使用します。
docker cp <Host path> <Container ID>:<Container path>
例:
docker cp /tmp/mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
docker cp C:\Temp\mydb.mdf d6b75213ef80:/var/opt/mssql/data
タイム ゾーンを構成する
特定のタイム ゾーンで Linux コンテナーの SQL Server を実行するには、TZ
環境変数を構成します (詳細は、「Linux で SQL Server 2022 のタイム ゾーンを構成する」を参照してください)。 適切なタイム ゾーン値を検索するには、Linux bash プロンプトから tzselect
コマンドを実行します。
tzselect
タイム ゾーンを選択すると、tzselect
に次の例のような出力が表示されます。
The following information has been given:
United States
Pacific
Therefore TZ='America/Los_Angeles' will be used.
この情報を使用して、Linux コンテナー内で同じ環境変数を設定できます。 次の例は、Americas/Los_Angeles
タイム ゾーンのコンテナー内で SQL Server を実行する方法を示しています。
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2017-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2019-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>' \
-p 1433:1433 --name sql1 \
-e 'TZ=America/Los_Angeles' \
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" `
-p 1433:1433 --name sql1 `
-e "TZ=America/Los_Angeles" `
-d mcr.microsoft.com/mssql/server:2022-latest
sudo docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=<YourStrong!Passw0rd>" ^
-p 1433:1433 --name sql1 ^
-e "TZ=America/Los_Angeles" ^
-d mcr.microsoft.com/mssql/server:2022-latest
tempdb
のパスを変更する
tempdb
データベースをユーザー データベースから分離しておくのはよいことです。
SQL Server インスタンスに接続してから、次の Transact-SQL (T-SQL) スクリプトを実行します。
tempdb
に関連付けられているファイルが他にもある場合は、それらも移動する必要があります。ALTER DATABASE tempdb MODIFY FILE ( NAME = tempdev, FILENAME = '/var/opt/mssql/tempdb/tempdb.mdf' ); GO ALTER DATABASE tempdb MODIFY FILE ( NAME = templog, FILENAME = '/var/opt/mssql/tempdb/templog.ldf' ); GO
次の T-SQL スクリプトを使用して、
tempdb
ファイルの場所が変更されたことを確認します。SELECT * FROM sys.sysaltfiles WHERE dbid = 2;
これらの変更を有効にするには、SQL Server コンテナーを再起動する必要があります。
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
docker stop sql1 docker start sql1
対話型
bash
セッションを開いてコンテナーに接続します。docker exec -it sql1 bash
docker exec -it sql1 bash
docker exec -it sql1 bash
対話型シェルに接続したら、次のコマンドを実行して
tempdb
の場所を確認します。ls /var/opt/mssql/tempdb/
移動が成功した場合は、次のような出力が表示されます。
tempdb.mdf templog.ldf
既定のファイルの場所を変更する
ご利用の docker run
コマンド内にデータ ディレクトリを変更するための MSSQL_DATA_DIR
変数を追加してから、ご利用のコンテナーのユーザーがアクセスできるその場所にボリュームをマウントします。
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2017-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2019-latest
docker run -e 'ACCEPT_EULA=Y' -e 'MSSQL_SA_PASSWORD=MyStrongPassword' \
-e 'MSSQL_DATA_DIR=/my/file/path' \
-v /my/host/path:/my/file/path \
-p 1433:1433 \
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e 'ACCEPT_EULA=Y' -e "MSSQL_SA_PASSWORD=MyStrongPassword" `
-e "MSSQL_DATA_DIR=/my/file/path" `
-v /my/host/path:/my/file/path `
-p 1433:1433 `
-d mcr.microsoft.com/mssql/server:2022-latest
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=MyStrongPassword" ^
-e "MSSQL_DATA_DIR=/my/file/path" ^
-v /my/host/path:/my/file/path ^
-p 1433:1433 ^
-d mcr.microsoft.com/mssql/server:2022-latest
mssql-config を使用してコンテナー内の SQL Server を構成する
mssql-conf ツールを使用して、SQL Server コンテナーでパラメーターを設定できます。
たとえば、次の手順を使用して、インスタンスのメモリ制限を設定できます。
ルート ユーザーとして
docker exec
を使用して、コンテナーに直接接続します。sqlcontainer
をコンテナー名に置き換えます。docker exec -u root -it sqlcontainer "bash"
mssql-conf を使用して設定を変更します。 この例では、
memory.memorylimitmb
設定を 2 GB (2,048 MB (メガバイト)) に変更します。/opt/mssql/bin/mssql-conf set memory.memorylimitmb 2048
カスタム Docker コンテナーの例
カスタム Docker コンテナーの例については、https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples を参照してください。 以下のような例が含まれています。
- フルテキスト検索を使用した Dockerfile の例
- RHEL 7 および SQL Server 2019 の Dockerfile の例
- RHEL 8 および SQL Server 2017 の Dockerfile の例
- フルテキスト検索、PolyBase、ツールを使用した Ubuntu 20.04 および SQL Server 2019 の Dockerfile の例
Dockerfiles を使用して Docker コンテナーをビルドして実行する方法については、GitHub の「ML Services の例」を参照してください。
関連するコンテンツ
- クイックスタートに従って、Docker 上で SQL Server 2017 (14.x) のコンテナー イメージを開始する
- クイックスタートに従って、Docker 上で SQL Server 2019 (15.x) のコンテナー イメージを開始する
- クイックスタートに従って、Docker 上で SQL Server 2022 (16.x) のコンテナー イメージを開始する
SQL ドキュメントへの投稿
SQL コンテンツを自分で編集できることはご存じですか。 これにより、ドキュメントが改善されるだけでなく、ページの共同作成者としてもクレジットされます。
詳細については、「SQL Server のドキュメントに投稿する方法」を参照してください。