SQL Server Docker コンテナーを構成およびカスタマイズする

適用対象: SQL Server (サポートされているすべてのバージョン) - Linux

この記事では、お使いのデータの永続化、コンテナーからのファイルの移動、既定の設定の変更など、SQL Server Docker コンテナーを構成およびカスタマイズする方法について説明します。

カスタマイズしたコンテナーを作成する

独自の 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 フラグと共に使用します。 これにより、コンテナーの実行間でデータを復元できます。

Note

SQL Server 2019 コンテナーは自動的に非ルートとして起動するのに対し、SQL Server 2017 コンテナーは既定でルートとして起動します。 SQL Server コンテナーを非ルートとして実行する方法の詳細については、セキュリティの構成に関するページを参照してください。

重要

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 の外部にあるホスト上のファイルを共有して表示することもできます。

データ ボリューム コンテナーを使用する

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

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 の CU15、SQL Server 2017 の 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 以上に設定することをお勧めします。

  1. また、コンテナー内の 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 でタイム ゾーンを構成する」を参照してください)。 適切なタイム ゾーン値を検索するには、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 'A_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

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 コンテナーの例

カスタム Docker コンテナーの例については、https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples を参照してください。 以下のような例が含まれています。

Dockerfiles を使用して Docker コンテナーをビルドして実行する方法については、https://github.com/microsoft/mssql-docker/tree/master/linux/preview/examples/mssql-mlservices を参照してください。

次のステップ