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 stopdocker 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 ベースのバックアップまたは復元を有効にします。

  1. 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 以上に設定することをお勧めします。

  2. コンテナー内で 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 データベースをユーザー データベースから分離しておくのはよいことです。

  1. 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
    
  2. 次の T-SQL スクリプトを使用して、tempdb ファイルの場所が変更されたことを確認します。

    SELECT *
    FROM sys.sysaltfiles
    WHERE dbid = 2;
    
  3. これらの変更を有効にするには、SQL Server コンテナーを再起動する必要があります。

    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
    docker stop sql1
    docker start sql1
    
  4. 対話型 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 コンテナーでパラメーターを設定できます。

たとえば、次の手順を使用して、インスタンスのメモリ制限を設定できます。

  1. ルート ユーザーとして docker exec を使用して、コンテナーに直接接続します。 sqlcontainer をコンテナー名に置き換えます。

    docker exec -u root -it sqlcontainer "bash"
    
  2. 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 を参照してください。 以下のような例が含まれています。

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 のドキュメントに投稿する方法」を参照してください。